opengl SFML模糊着色器不显示效果

zbsbpyhn  于 2023-10-18  发布在  其他
关注(0)|答案(3)|浏览(114)

我试图实现一个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);
}

但由于某种原因,图像显示正常,没有任何影响。我也没有任何错误。有谁知道为什么模糊效果不显示?

o2gm4chl

o2gm4chl1#

我对SFML一无所知,但我看起来你的blur_radius选择得不好。您的图像大小为100 x100,您的Blur-Shader以200 px(blur_radius)的距离对图像进行采样。因此,如果你的纹理启用了gl_repeat,你会击中与原始像素完全相同的像素。->无模糊
尝试使用较低的blur_radius,可能在2-5左右

bvjveswy

bvjveswy2#

在我的问题中:SFML shader not working我在这个问题上也得到了帮助,我建议你去看看tntxtnt的答案,这可能会帮助你。但基本上它并没有模糊纹理的轮廓,它只模糊了精灵内部的颜色。

wmtdaxz3

wmtdaxz33#

我还使用了sfml示例中的着色器,问题是那里使用了gl_Color,但您没有以任何方式初始化它,也就是说,它= 0。
gl_FragColor = gl_Color * (pixel / 16.0);替换为gl_FragColor = pixel / 16.0;

相关问题