SFML着色器不工作
我试图单击时,他们创建一个轮廓效果,我的按钮,但ATM我只是测试的东西着色器......每当我画的东西与我的着色寿它呈现的形状完全黑SFML着色器不工作
#include <SFML\Graphics.hpp>
int main(){
sf::RenderWindow window(sf::VideoMode(500, 500), "hello world", sf::Style::Close);
sf::RectangleShape rect;
rect.setSize(sf::Vector2f(100, 100));
rect.setFillColor(sf::Color::Red);
sf::Shader blur;
if (!blur.loadFromFile("blur.frag", sf::Shader::Fragment)){
return 1;
}
if (!blur.isAvailable()){
return 1;
}
blur.setUniform("texture", sf::Shader::CurrentTexture);
blur.setUniform("blur_radius", 0.002f);
while (window.isOpen()){
sf::Event evnt;
while (window.pollEvent(evnt)){
if (evnt.type == sf::Event::Closed)
window.close();
}
window.clear(sf::Color(0, 100, 100));
sf::RenderStates state;
state.shader = &blur;
window.draw(rect, state);
window.display();
}
return 0;
}
和我的着色器代码。
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);
}
我期望一个模糊的红色矩形出现在左上角的圆角,而不是一个黑色的实心矩形。
因为rect
没有纹理附加到它,在blur.frag使用的所有像素都无效,我想在这种情况下,用黑色的像素,因此黑色矩形。
你应该create a texture(使用sf::RenderTexture
),绘制任何你想要的,然后在它上面创建一个sf::Sprite
并绘制这个精灵。或者,您可以加载纹理from an image。
#include <SFML/Graphics.hpp>
int main(){
sf::RenderWindow window(sf::VideoMode(200, 200), "hello world", sf::Style::Close);
window.setFramerateLimit(60);
sf::RectangleShape rectBlue;
rectBlue.setSize(sf::Vector2f(100, 50));
rectBlue.setFillColor(sf::Color::Blue);
sf::RectangleShape rectYellow;
rectYellow.setSize(sf::Vector2f(100, 50));
rectYellow.setFillColor(sf::Color::Yellow);
rectYellow.setPosition(0, 50);
sf::RenderTexture renderTexture;
if (!renderTexture.create(100, 100)){ //create a render texture
return 1;
}
renderTexture.clear();
renderTexture.draw(rectBlue); //draw blue rect on the render texture
renderTexture.draw(rectYellow); //draw yellow rect
renderTexture.display();
sf::Sprite sprite(renderTexture.getTexture()); //create a sprite from the created texture
sf::Shader blur;
if (!blur.loadFromFile("blur.frag", sf::Shader::Fragment)){
return 1;
}
if (!blur.isAvailable()){
return 1;
}
blur.setUniform("texture", sf::Shader::CurrentTexture);
blur.setUniform("blur_radius", 0.05f);
while (window.isOpen()){
sf::Event evnt;
while (window.pollEvent(evnt)){
if (evnt.type == sf::Event::Closed)
window.close();
}
window.clear(sf::Color(0, 100, 100));
window.draw(sprite, &blur); //draw the sprite with blur shader
window.display();
}
return 0;
}
结果:
TY这么多的很好的解释和明确的答案。这对我来说是一个非常烦人的问题。但是这并不是我想要的......这个模糊着色器没有按照我想要的方式工作。你知道我如何创建一个模糊精灵轮廓的着色器吗? –
快速且肮脏的方法:您可以在分配gl_FragColor之前简单地检查像素alpha'pixel.a'。如果'pixel.a tntxtnt
我一天中大部分时间都在使用,但我最终自己想出了它,并且在procces中我编写了我的第一个着色器程序......非常感谢您的帮助tntxtnt你给了我做第一个着色器程序的动力 –
请在[MCVE]编辑。 –
@BartekBanachewicz它现在 –
更新着色器的代码看起来不错。尽管这会让模糊的红色矩形出现,但代码中没有任何内容。你有一个蓝色的矩形,你应用着色器,但你期望什么?你不能模糊一种颜色。为了看到模糊效果,你必须有其他的东西,你可以模糊颜色。做到以下几点作为一个实验:应用模糊着色器的整个场景,你会看到它会按预期工作:) – user3881815