我正在尝试按照他们的示例实现SFML着色器,但它没有显示出来。
GameObject
是一个继承并实现sf::Drawable
的类。在GameObject
内,我有一个sf::Texture
和一个sf::Sprite
个对象,负责游戏对象的图像。我正在尝试对它应用模糊效果。这是我加载图像和着色器的.cpp:
x = new GameObject("Images/apple.png", 100, 100, 1, 1);
mshade.loadFromFile("Shaders/blur.frag", sf::Shader::Fragment);
mshade.setParameter("texture", *(x)->objectTexture);
mshade.setParameter("blur_radius", 200);
这就是我画画的方式:
gameWindow->draw(*x, &mshade);
这是用于创建模糊着色器的GLSL代码:
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);
}
但由于某种原因,图像显示正常,没有任何影响。我也没有得到任何错误。有谁知道为什么模糊效果没有出现?
答案 0 :(得分:1)
我对SFML一无所知,但我看起来你的blur_radius没有很好的选择。 您的图像大小为100x100,而Blur-Shader采样距离为200px(blur_radius)。因此,如果您的纹理启用了gl_repeat,那么您将获得与原始纹理完全相同的像素。 - >没有模糊
尝试使用较低的blur_radius,可能是2-5左右
答案 1 :(得分:0)
在我的问题中:SFML shader not working我在这个问题上得到了帮助,我还要重新检查tntxtnt的答案,这可能会对你有所帮助。但基本上它会模糊纹理的轮廓,它只会模糊精灵内部的颜色。