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