2014-10-08 77 views
0

我試圖在LibGDX中將兩個紋理(.PNG)圖像添加到我自己的着色器中。除了數學/混合部分,一切都很好。希望有人能幫助我解決這個混合問題!LIBGDX-着色器中不需要的紋理混合

enter image description here

這是我的基本紋理。 (256×256像素,32位紋理)

enter image description here

這是我 「ontop的」 質地。 (256×256像素,32位紋理)

enter image description here

我想要的效果。一個簡單的基礎紋理與另一個紋理ontop,與透明度的工作。

enter image description here

而目前的結果。紋理之間的混合,紋理的「點」所在的位置會更亮一些。

我試過幾種不同的解決方案。這是渲染器,我的類,它實現LibGDX的着色器:

 Gdx.gl20.glEnable(Gdx.gl20.GL_BLEND); <-- Doesn't do any difference. 
    Gdx.gl20.glBlendFunc(Gdx.gl20.GL_ONE, Gdx.gl20.GL_ONE_MINUS_SRC_ALPHA); <-- Dosen't do any difference with the cube, but make vertices transparent on a more advanced mesh. 

片段着色器:

#ifdef GL_ES 
precision mediump float; 
#endif 

varying vec2 v_texCoord0; 
uniform sampler2D u_texture1; 
uniform sampler2D u_texture2; 
void main() { 
vec4 bodyColor = texture2D(u_texture1, v_texCoord0); 
vec4 addColor = texture2D(u_texture2, v_texCoord0); 

gl_FragColor = bodyColor + addColor; 
} 

東西顯然是錯誤的。

回答

1

由於您在着色器中混合了兩個紋理,所以混合函數與此無關。

您當前的着色器只是添加了兩種顏色,如果您繪製了兩個網格物體,則第二種顏色使用GL_ONE, GL_ONE

實際上,您希望第二個紋理基於其alpha來完全替換第一個紋理,就像您繪製兩個網格一樣,第二個紋理使用GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA。這意味着紋理2的RGB乘以其alpha,而紋理1的RGB乘以(1-紋理2的alpha)。然後將這兩個結果加在一起。

因此,您可以創建混合函數完成的相同方程,但現在我們在着色器中執行該方程。

gl_FragColor = vec4(bodyColor.rgb*(1.0-addColor.a) + addColor.rgb*addColor.a, 1.0); 

我想你也可以這樣寫;

gl_FragColor = vec4(mix(bodyColor.rgb, addColor.rgb, addColor.a), 1.0); 

那場決賽1.0是你的輸出阿爾法:如果GPU具有了一種優化組合功能的表現很可能是等效的,但可能更好。你沒有指定你想要的最終輸出結果是什麼樣的結果。如果您希望整個東西繼承基礎紋理的Alpha,請將1.0更改爲bodyColor.a

+0

非常感謝您解釋得非常好的答案!我不知道我必須使用alpha值並以這種方式使用它,但是這幫助了我很多!不僅要解決問題,還要了解更多關於GPU和着色器的知識! 再次感謝Tenfour04! – user2774429 2014-10-08 23:09:31