2014-07-11 47 views
1

我試圖按照他們的示例實現SFML着色器,並且它不顯示。SFML模糊着色器顯示沒有效果

GameObject是繼承和實現sf::Drawable的類。裏面有GameObject我有一個sf::Texture和一個sf::Sprite對象,負責遊戲對象的圖像。我試圖對它應用模糊效果。這裏就是我加載圖像和着色器的.cpp:

x = new GameObject("Images/apple.png", 100, 100, 1, 1); 
mshade.loadFromFile("Shaders/blur.frag", sf::Shader::Fragment); 
mshade.setParameter("texture", *(x)->objectTexture); 
mshade.setParameter("blur_radius", 200); 

而且我這是怎麼畫出來:

gameWindow->draw(*x, &mshade);

這是GLSL代碼來創建模糊着色器:

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); 
} 

但由於某種原因,圖像顯示方式與通常一樣,沒有任何影響。我也沒有得到任何錯誤。有誰知道爲什麼模糊效果不顯示?

+1

我想象你還需要一個頂點着色器(除非SFML默認自己的頂點着色器,如果沒有提供)。 sd :: Shader :: loadFromFile()是否返回true? – Homar

+0

根據他們的教程,您只能使用一種類型的着色器。我將檢查loadFromFile以查看它是否有效。 – user3141607

回答

1

我對SFML一無所知,但我看起來像你的blur_radius沒有很好的選擇。 您的圖像尺寸爲100x100,而您的Blur-Shader以200px的距離(blur_radius)對圖像進行採樣。因此,如果您的紋理啓用了gl_repeat,則會像原始像素一樣點擊相同的像素。 - >無殘影

嘗試使用較低的blur_radius或許真的各地2-5

+0

我將其更改爲3,也嘗試了0..1個值。同樣的結果.. – user3141607

0

那麼在我的問題在:SFML shader not working我得到的幫助在這個問題上藏漢我recoomend你去看看tntxtnt的回答,可能會幫助你。但基本上它的劑量模糊紋理的輪廓,它只會模糊精靈內部的顏色。