LIBGDX-着色器中不需要的纹理混合

时间:2014-10-08 17:21:40

标签: java android opengl-es libgdx shader

我试图将LibGDX中的两个纹理(.PNG)图像添加到我自己的着色器中。一切都很好,除了数学/混合部分。希望有人可以帮我解决这个混合问题!

enter image description here

这是我的基础纹理。 (256 x 256 px,32位纹理)

enter image description here

这是我的" ontop"质地。 (256 x 256 px,32位纹理)

enter image description here

我想要的效果。一个简单的基础纹理,上面有另一个纹理,其中包含透明度。

enter image description here

目前的结果。在纹理之间进行混合,在#34;点"纹理是。

我尝试了几种不同的解决方案。这是来自渲染器,我的类实现了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 个答案:

答案 0 :(得分:1)

由于您在着色器中混合了两个纹理,因此混合函数与此无关。

您当前的着色器只会添加两种颜色,如果您绘制了两个网格,则相同,第二种颜色使用GL_ONE, GL_ONE

您实际上希望第二个纹理基于其alpha完全替换第一个纹理,就像您绘制了两个网格一样,第二个纹理使用GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA。这意味着纹理2的RGB乘以其alpha,而纹理1的RGB乘以(1- texture2&#39; s alpha)。然后将两个结果加在一起。

因此,您创建了一个混合函数可以完成的相同方程,但现在我们在着色器中进行。

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

我想你也可以这样写;性能可能相当,但如果GPU有办法优化混合功能可能会更好:

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

最终1.0是你的输出alpha。您没有指定最终输出所需的结果alpha值。如果您希望整个事物继承基础纹理的alpha,请将1.0更改为bodyColor.a