SFML 模糊着色器没有显示效果

问题描述 投票:0回答:3

我正在尝试按照他们的示例实现 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);
}

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

c++ opengl glsl sfml
3个回答
1
投票

我对SFML一无所知,但我看起来你的blur_radius选择得不好。 您的图像尺寸为 100x100,模糊着色器以 200px (blur_radius) 的距离对图像进行采样。因此,如果您的纹理启用了 gl_repeat ,您将击中与原始像素完全相同的像素。 -> 没有模糊

尝试使用较低的blur_radius,也许是2-5左右


0
投票

我的问题是:SFML 着色器不工作我也得到了关于这个问题的帮助,我建议你去看看 tntxtnt 的答案,这可能会对你有所帮助。但基本上它不会模糊纹理的轮廓,它只会模糊精灵内部的颜色。


0
投票

我还使用了sfml示例中的着色器,问题是那里使用了gl_Color,但你没有以任何方式初始化它,也就是说,它= 0。

gl_FragColor = gl_Color * (pixel / 16.0);
替换为
gl_FragColor = pixel / 16.0;

© www.soinside.com 2019 - 2024. All rights reserved.