2014-10-08 73 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