2012-10-28 60 views
2

因此,我的應用程序主要使用rgba紋理進行渲染,但在少數情況下,我使用alpha蒙版來渲染文本。使用相同的着色器處理GL_RGBA和GL_ALPHA紋理?

我想我的片段着色器的輸出是在給定的座標乘以我傳入的顏色統一的紋理採樣器的值。問題是我找不到一個簡單的解決方案來處理案例。

所以對於RGBA紋理這給期望的結果:

gl_FragColor = texture2D(diffuseTexture, varTexcoord.st, 0.0) * color; 

但對於阿爾法紋理,輸出始終是黑色的。我假定紋理採樣器將alpha紋理的每個像素視爲:rgba(0,0,0,alpha),並且我希望它被視爲rgba(1,1,1,alpha)。我可以通過以下方式在alpha紋理上獲得理想的效果:

gl_FragColor = texture2D(diffuseTexture, varTexcoord.st, 0.0).w * color; 

但是,顯然這打破了rgba紋理。

我對GLSL相當陌生,我想知道是否有一種很好的方法來處理這兩種情況,或者如果我將必須有2個不同的着色器,或者將我所有的aplha紋理轉換爲rgba 。

編輯:

我想我會加載資產時,最終重新包裝我的阿爾法紋理作爲GL_LUMINANCE_ALPHA紋理。

+0

簡單你的假設是正確的,GL_ALPHA映射到RGBA爲{R = 0,G = 0,B = 0,A = A} –

+0

您使用的桌面OpenGL或OpenGL的ES? –

+0

這是用於OpenGL ES – sak

回答

1

您有兩種不同的方式來處理數據。所以你有兩個不同的着色器。切換它們。着色器反映了將要發生的事情。

如果您對glTexEnv,lighting等的每個設置使用舊的,取消固定的固定功能管線,則會原地創建特定着色器。

切換着色器是調用glUseProgramm

+1

真的,這是處理數據的一種方法。數據在功能上是相同的;唯一的區別是某些數據格式不正確。這就是爲什麼*桌面* OpenGL具有[紋理混合](http://www.opengl.org/wiki/Texture#Swizzle_mask),所以你可以照顧這樣的小格式問題,而不涉及着色器。 –

+0

@NicolBolas:在那個簡單的例子中,是的,但是如果有兩個着色器以不同的方式處理通道會怎麼樣。 – datenwolf

+0

然後他不會要求單一着色解決方案。他*具體的*問題是他想要單一着色解決方案,因爲着色器代碼是相同的。數學的唯一問題是來自alpha紋理的RGB分量。他沒有尋找一種通用的解決方案來將着色器代碼放入紋理獲取或其他東西;他正在尋找一個解決這個特殊情況下獲得0而不是1的解決方案。 Swizzle口罩存在解決這個確切的問題,這可能比你想象的更頻繁地發生。 –