【发布时间】:2017-06-01 07:15:09
【问题描述】:
我正在尝试在单击按钮时为我的按钮创建轮廓效果,但 atm 我只是在使用着色器测试东西......每当我用我的着色器绘制一些东西时,它都会使形状完全变黑
#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);
}
我希望左上角会出现一个模糊的红色矩形,但会出现一个黑色实心矩形。
【问题讨论】:
-
@BartekBanachewicz 现在更新了
-
着色器代码看起来不错。尽管会出现模糊的红色矩形,但您的代码中没有任何内容。您有一个将着色器应用到的蓝色矩形,但是您期望什么?你不能只模糊一种颜色。为了看到模糊效果,你必须有别的东西,你可以用它来模糊颜色。做以下实验:将模糊着色器应用到整个场景,你会看到它会按预期工作:)
-
创建一个红色纹理,在上面制作一个精灵,然后绘制这个精灵。 RectangleShape 没有纹理,所以我猜它不受着色器的影响。
-
@user3881815 在我的原始代码中有这个三角形是红色的。但是使用这个最小的完整且可验证的示例,正如 bartek 建议的那样,我出于某种原因将矩形设为蓝色......我现在正在改变,感谢您指出它