我试图实现一个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);
}
但由于某种原因,图像显示正常,没有任何影响。我也没有任何错误。有谁知道为什么模糊效果不显示?
3条答案
按热度按时间o2gm4chl1#
我对SFML一无所知,但我看起来你的blur_radius选择得不好。您的图像大小为100 x100,您的Blur-Shader以200 px(blur_radius)的距离对图像进行采样。因此,如果你的纹理启用了gl_repeat,你会击中与原始像素完全相同的像素。->无模糊
尝试使用较低的blur_radius,可能在2-5左右
bvjveswy2#
在我的问题中:SFML shader not working我在这个问题上也得到了帮助,我建议你去看看tntxtnt的答案,这可能会帮助你。但基本上它并没有模糊纹理的轮廓,它只模糊了精灵内部的颜色。
wmtdaxz33#
我还使用了sfml示例中的着色器,问题是那里使用了gl_Color,但您没有以任何方式初始化它,也就是说,它= 0。
将
gl_FragColor = gl_Color * (pixel / 16.0);
替换为gl_FragColor = pixel / 16.0;