2017-06-01 75 views
0

我試圖單擊時,他們創建一個輪廓效果,我的按鈕,但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); 
} 

我期望一個模糊的紅色矩形出現在左上角的圓角,而不是一個黑色的實心矩形。

This is the result of the code above

+0

請在[MCVE]編輯。 –

+0

@BartekBanachewicz它現在 –

+0

更新着色器的代碼看起來不錯。儘管這會讓模糊的紅色矩形出現,但代碼中沒有任何內容。你有一個藍色的矩形,你應用着色器,但你期望什麼?你不能模糊一種顏色。爲了看到模糊效果,你必須有其他的東西,你可以模糊顏色。做到以下幾點作爲一個實驗:應用模糊着色器的整個場景,你會看到它會按預期工作:) – user3881815

回答

2

因爲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; 
} 

結果:

enter image description here

+0

TY這麼多的很好的解釋和明確的答案。這對我來說是一個非常煩人的問題。但是這並不是我想要的......這個模糊着色器沒有按照我想要的方式工作。你知道我如何創建一個模糊精靈輪廓的着色器嗎? –

+0

快速且骯髒的方法:您可以在分配gl_FragColor之前簡單地檢查像素alpha'pixel.a'。如果'pixel.a <16.0'然後模糊它:'gl_FragColor = gl_Color *(p​​ixel/16.0);',否則:'gl_FragColor = gl_Color * texture2D(texture,gl_TexCoord [0] .xy)'。如果你想要一個透明的渲染紋理,那麼不要調用'renderTexture.clear()' – tntxtnt

+0

我一天中大部分時間都在使用,但我最終自己想出了它,並且在procces中我編寫了我的第一個着色器程序......非常感謝您的幫助tntxtnt你給了我做第一個着色器程序的動力 –