Glsl 将模糊着色器应用于sf::RectangleShape
我有一个对象,它是一个用于基于平铺的游戏的sf::矩形的2d数组。它应该看起来像一朵云,所以我想给它添加一些模糊。下面是它现在的样子: 我希望它看起来像这样: 本能地,它似乎在低级别上实现了这种模糊效果,我必须将云对象绘制到缓冲区,然后将模糊对象应用到缓冲区。但我不确定SFML是否已经在这样做了 在我的主循环中,我有:Glsl 将模糊着色器应用于sf::RectangleShape,glsl,sfml,Glsl,Sfml,我有一个对象,它是一个用于基于平铺的游戏的sf::矩形的2d数组。它应该看起来像一朵云,所以我想给它添加一些模糊。下面是它现在的样子: 我希望它看起来像这样: 本能地,它似乎在低级别上实现了这种模糊效果,我必须将云对象绘制到缓冲区,然后将模糊对象应用到缓冲区。但我不确定SFML是否已经在这样做了 在我的主循环中,我有: for( CloudIterator it = clouds.begin(); it != clouds.end(); it++ ) { window.d
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...
}
所以,我可能有点天真的窗口。画**它,&模糊着色器将只是工作。我应该在Cloud::draw函数中获取并应用着色器吗
然而,结果是云是完全黑色的。GLSL文件中引用的纹理是否需要加载
我很确定你必须自己设置纹理。如果查看着色器示例,当加载每个着色器时,作者将当前纹理绑定为纹理参数。你可能也得做同样的事情
m_shader.setParameter("texture", sf::Shader::CurrentTexture);
如果sf::Shader::CurrentTexture引用不同的纹理,则必须显式获取正确的纹理。如果您的sf::矩形形状没有纹理,那么您当然不能模糊不存在的东西
如果您的形状没有自己的纹理,您可以通过将形状渲染到sf::RenderTexture,然后使用sf::RenderTexture渲染sf::Sprite并将着色器应用于该绘制调用来实现所需效果。啊,我想我希望在绘制时能够以某种方式模糊GL四边形。最后,我按照你最后一段中的建议做了以下工作: