我正在尝试将 LibGDX 中的两个纹理 (.PNG) 图像添加到我自己的着色器中。除了数学/混合部分之外,一切都很好。希望有人能帮助我解决这个混合问题!
这是我的基础纹理。 (256 x 256 像素,32 位纹理)
这是我的“ontop”纹理。 (256 x 256 像素,32 位纹理)
我想要的效果。一个简单的基础纹理,上面有另一个纹理,当然可以使用透明度。
以及当前的结果。纹理之间的混合,纹理“点”所在的地方更亮一些。
我尝试了几种不同的解决方案。这是来自渲染器,我的类实现了 LibGDX 的 Shader:
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.
fragment 着色器:
#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;
}
明显有问题。
最佳答案
由于您是在着色器内混合两个纹理,因此混合函数与此无关。
您当前的着色器仅添加两种颜色,如果您绘制了两个网格,则这是相同的,第二个使用 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);
我想你也可以这样写;性能可能相当,但如果 GPU 有办法优化混合功能,性能可能会更好:
gl_FragColor = vec4(mix(bodyColor.rgb, addColor.rgb, addColor.a), 1.0);
那场 final 1.0
是你的输出阿尔法。您没有指定最终输出所需的 alpha 类型。如果您希望整个事物继承基础纹理的 Alpha,请更改 1.0
至bodyColor.a
。
关于java - LIBGDX - 着色器中不需要的纹理混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26262750/