2015-10-01 49 views
0

我正在開發一款遊戲並添加了着色器,該着色器會將每一個東西都變成灰度,然後變成黑色。着色器本身工作正常,但是當它啓動時,Spritebatch和Sprites的一些功能停止工作。顏色的變化被忽略,任何事物的阿爾法總是1.當默認着色器使用這些方法通常是負責哪些工作非常良好的圖形變化:LibGDX Shader停用重要的SpriteBatch方法

sprite.setColor(Color.RED); 
sprite.setAlpha((float)lifeTime/100f); 
sprite.draw(pBatch); 

此代碼顏色彈出紅色,改變了alpha然後繪製它。當着色器打開時,它只是繪製它,就像前兩行不存在一樣。

這裏的着色器的代碼:

頂點:

attribute vec4 a_position; 
attribute vec4 a_color; 
attribute vec2 a_texCoord0; 

uniform mat4 u_projTrans; 

varying vec4 v_color; 
varying vec2 v_texCoords; 

void main() { 
    v_color = a_color; 
    v_texCoords = a_texCoord0; 
    gl_Position = u_projTrans * a_position; 
} 

片段:

#ifdef GL_ES 
    precision mediump float; 
#endif 

varying vec2 v_texCoords; 
uniform sampler2D u_texture; 
uniform mat4 u_projTrans; 

uniform float u_fade; 

void main() { 
     float gray_fade = u_fade; 
     float dark_fade = 1; 
     if(u_fade >= 1){ 
      gray_fade = 1; 
      dark_fade = 2-u_fade; 
     } 

     vec4 color = texture2D(u_texture, v_texCoords).rgba; 
     float gRed = color.r - (color.r - (0.299*color.r + 0.587*color.g + 0.114*color.b))* gray_fade; 
     float gGreen = color.g - (color.g - (0.299*color.r + 0.587*color.g + 0.114*color.b))* gray_fade; 
     float gBlue = color.b - (color.b - (0.299*color.r + 0.587*color.g + 0.114*color.b))* gray_fade; 
     vec3 grayscale = vec3(gRed * dark_fade, gGreen * dark_fade, gBlue * dark_fade); 


     gl_FragColor = vec4(grayscale, color.a); 

} 
+0

我認爲你沒有自己寫着色器? – Tenfour04

+0

我在教程的幫助下編寫了這兩個代碼,並修改了許多片段着色器以使其適合我的遊戲。頂點着色器大多是相同的 –

+0

好吧,只是好奇。這聽起來像一個光滑的效果。 – Tenfour04

回答

2

着色器被忽略了精靈的頂點顏色。

把聲明varying vec4 v_color;到您的片段着色器,改變最後一行:

gl_FragColor = vec4(grayscale*v_color.rgb, color.a*v_color.a); 

編輯:

它發生,我認爲上面會打敗灰度設置和會如果你場景中的某些精靈是有顏色的,那麼處理這個問題會很麻煩。因此,相反,離開這個gl_FragColor線孤獨,移動乘法,直到您品嚐紋理顏色:

vec4 color = texture2D(u_texture, v_texCoords) * v_color; 

還有一個在你的着色器的一大效率低,計算同積三次!此外,我認爲有些情況下,一次執行整個矢量的計算可能比單獨手動執行更快。

所以我想改變在中間的五行:

vec4 color = texture2D(u_texture, v_texCoords); 
float grayValue = dot(color.rgb, vec3(0.299, 0.587, 0.1144)); 
vec3 grayscale = (color.rgb - (color.rgb - grayValue) * gray_fade) * dark_fade; 

關於你的着色器的if聲明:在一般情況下,分支語句在片段着色器非常顯著撞擊時,應避免使用。但在這種情況下,分支是一個統一的if語句,所以我不確定它是否會產生重大影響,因爲它會在整個平局調用中評估相同。如果這確實會導致性能問題,那麼可以用u_gray_fadeu_dark_fade代替u_fade並將此計算移出着色器。

+0

非常感謝!它現在(幾乎)很好,但我認爲我可以自己做其餘的:) 非常感謝你對錶演的暗示。我對着色器比較陌生,當我剛剛製作這些着色器時很開心:D 當我編寫我的下一個着色器時,我會記住性能提示;) –

+0

我注意到我犯了一個錯誤。請參閱上述編輯。 – Tenfour04

+0

謝謝,現在完美! –

相關問題