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

标签 java android opengl-es libgdx shader

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

以及当前的结果。纹理之间的混合,纹理“点”所在的地方更亮一些。

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

关于java - LIBGDX - 着色器中不需要的纹理混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26262750/

相关文章:

android - 以编程方式设置 Android IP、DNS、GATEWAY 设置

java - 从 Realm 检索 RealmObject 后将其设置为另一个 RealmObject

java - 我应该使用 OpenGL 来制作带动画的国际象棋吗?

java - 如何在Jsoup中解析这个特定的数据

java - main方法可以放在父类中吗?如果是这样,可以在该 main 方法中实例化子对象吗?

java - 在 Core Java 中识别 Android 设备

android - OpenGLRenderer 试图缩小位图 - 当到达 ViewPager 的末尾时

android - 不同混合模式的 OpenGL ES 性能

android - 如何手动创建 mipmap?

java - JPA 逆向工程师之后 - 未定义 [javax.persistence.EntityManagerFactory] ​​类型的唯一 bean : expected single bean but found 0