我有一个对象是sf :: RectangleShapes的二维数组(对于基于图块的游戏)。它应该看起来像一个云,所以我想添加一些模糊。现在看来是这样的:
我希望它看起来像这样:
本能地,它似乎在低级别上实现了这种模糊效果,我必须将云对象绘制到缓冲区,然后将模糊对象应用于缓冲区。但我不确定SFML是否已经这样做了。
在我的主循环中,我有这个:
for( CloudIterator it = clouds.begin(); it != clouds.end(); it++ ) {
window.draw(**it);
}
我希望用以下内容代替:
for( CloudIterator it = clouds.begin(); it != clouds.end(); it++ ) {
window.draw(**it, &blurShader);
}
从以下GLSL文件加载blurShader的地方:
uniform sampler2D texture;
uniform float blur_radius;
void main()
{
vec2 offx = vec2(blur_radius, 0.0);
vec2 offy = vec2(0.0, blur_radius);
vec4 pixel = texture2D(texture, gl_TexCoord[0].xy) * 4.0 +
texture2D(texture, gl_TexCoord[0].xy - offx) * 2.0 +
texture2D(texture, gl_TexCoord[0].xy + offx) * 2.0 +
texture2D(texture, gl_TexCoord[0].xy - offy) * 2.0 +
texture2D(texture, gl_TexCoord[0].xy + offy) * 2.0 +
texture2D(texture, gl_TexCoord[0].xy - offx - offy) * 1.0 +
texture2D(texture, gl_TexCoord[0].xy - offx + offy) * 1.0 +
texture2D(texture, gl_TexCoord[0].xy + offx - offy) * 1.0 +
texture2D(texture, gl_TexCoord[0].xy + offx + offy) * 1.0;
gl_FragColor = gl_Color * (pixel / 16.0);
}
然而,结果是完全黑色的云。 GLSL文件中引用的纹理是否必须加载?
这些云对象的绘制代码如下所示,从sf :: Drawable:
重载void Cloud::draw(sf::RenderTarget& target, sf::RenderStates states) const {
states.transform *= getTransform();
...loop to draw various sf::RectangleShape's in the Cloud...
}
所以,我window.draw(**it, &blurShader)
可能会有点天真。我应该在Cloud :: draw函数中获取和应用着色器吗?
答案 0 :(得分:0)
然而,结果是完全黑色的云。 GLSL文件中引用的纹理是否必须加载?
我很确定你必须自己设置纹理。如果查看着色器示例,则在加载每个着色器时,作者会将当前纹理绑定为texture
参数。你可能不得不做同样的事情。
m_shader.setParameter("texture", sf::Shader::CurrentTexture);
如果sf::Shader::CurrentTexture
指的是不同的纹理,那么你必须明确地获得正确的纹理。如果你的sf :: RectangleShapes没有纹理,那么当然你不能模糊不存在的东西。
如果您的形状没有自己的纹理,您可以通过将形状渲染为sf::RenderTexture
,然后使用“sf::Sprite
渲染sf::RenderTexture
来获得所需的效果。 {{1}}并将着色器应用于绘制调用。