【问题标题】:LIBGDX- Unwanted texture blending in the shaderLIBGDX-着色器中不需要的纹理混合
【发布时间】:2014-10-08 17:21:39
【问题描述】:

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

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

这是我的“顶部”纹理。 (256 x 256 像素,32 位纹理)

我想要的效果。一个简单的基础纹理,上面有另一个纹理,可以使用透明度。

还有当前的结果。纹理之间的混合,纹理的“点”所在的位置更亮。

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

显然有些不对劲。

【问题讨论】:

    标签: java android opengl-es libgdx shader


    【解决方案1】:

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

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

    您实际上希望第二个纹理根据其 alpha 完全替换第一个纹理,就像您绘制了两个网格一样,第二个使用 GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA。这意味着纹理 2 的 RGB 乘以其 alpha,而纹理 1 的 RGB 乘以 (1-texture2 的 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

    【讨论】:

    • 非常感谢您解释得很好的回答!我不知道我必须使用 alpha 值并以这种方式使用它,但这对我帮助很大!不仅要解决问题,还要了解更多关于 GPU 和着色器的知识!再次感谢 Tenfour04!
    猜你喜欢
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2023-04-01
    • 1970-01-01
    • 2016-12-20
    • 2014-03-06
    相关资源
    最近更新 更多