【问题标题】:Applying a blur shader to sf::RectangleShape对 sf::RectangleShape 应用模糊着色器
【发布时间】:2013-10-15 23:01:03
【问题描述】:

我有一个 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);
    }

blurShader 从以下 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);
    }

但是,结果是完全黑色的云。我必须加载 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 函数中获取和应用着色器吗?

【问题讨论】:

    标签: glsl sfml


    【解决方案1】:

    但是,结果是完全黑色的云。我必须加载 GLSL 文件中引用的纹理吗?

    我很确定您必须自己设置纹理。如果您查看着色器示例,当加载每个着色器时,作者将当前纹理绑定为texture 参数。您可能必须做同样的事情。

    m_shader.setParameter("texture", sf::Shader::CurrentTexture);
    

    如果sf::Shader::CurrentTexture 指的是不同的纹理,那么您必须明确获取正确的纹理。如果您的 sf::RectangleShapes 没有纹理,那么您当然不能模糊不存在的东西。

    如果您的形状没有自己的纹理,您可以通过将形状渲染到sf::RenderTexture,然后使用sf::RenderTexture 渲染sf::Sprite 和将着色器应用于该绘制调用。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2018-08-27
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多