1

sf::RectangleShapes (タイルベースのゲーム用) の 2 次元配列であるオブジェクトがあります。本来は雲に見えるはずなので、ぼかしを加えたいと思います。現在の外観は次のとおりです。

雲流

そして、私はそれを次のようにしたい:

ぼやけた雲

本能的に、低レベルでこのぼかし効果を達成しているように見えます。雲オブジェクトをバッファーに描画してから、ぼかしオブジェクトをバッファーに適用する必要があります。しかし、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);
    }

次のGLSLファイルからblurShaderがロードされる場所:

    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 関数でシェーダーを取得して適用する必要がありますか?

4

1 に答える 1

0

ただし、結果は完全に黒い雲です。GLSL ファイルで参照されているテクスチャは、ロードする必要がありますか?

テクスチャを自分で設定する必要があると確信しています。シェーダーの例を見ると、各シェーダーが読み込まれると、作成者は現在のテクスチャをtextureパラメーターとしてバインドします。おそらく同じことをしなければならないでしょう。

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

が別のテクスチャを参照している場合sf::Shader::CurrentTextureは、正しいテクスチャを明示的に取得する必要があります。sf::RectangleShapes がテクスチャを持たない場合、もちろんそこにないものをぼかすことはできません。

シェイプに独自のテクスチャがない場合は、シェイプを にレンダリングし、を使用して をsf::RenderTextureレンダリングし、シェーダをそのドローコールに適用することで、目的の効果を実現できる場合があります。sf::Spritesf::RenderTexture

于 2013-10-15T23:37:11.567 に答える