Java LIBGDX-着色器中不需要的纹理混合
我正在尝试将LibGDX中的两个纹理(.PNG)图像添加到我自己的着色器中。除数学/混合部分外,所有功能都很好。希望有人能帮我解决这个混合问题 这是我的基本纹理。(256 x 256像素,32位纹理) 这是我的“ontop”纹理。(256 x 256像素,32位纹理) 我想要的效果。一个简单的基础纹理和另一个纹理在上面,当然是透明的工作 以及目前的结果。在纹理之间混合,在纹理的“点”处稍微亮一点 我试过几种不同的解决办法。这来自renderer,我的类实现了LibGDX的着色器:Java LIBGDX-着色器中不需要的纹理混合,java,android,opengl-es,libgdx,shader,Java,Android,Opengl Es,Libgdx,Shader,我正在尝试将LibGDX中的两个纹理(.PNG)图像添加到我自己的着色器中。除数学/混合部分外,所有功能都很好。希望有人能帮我解决这个混合问题 这是我的基本纹理。(256 x 256像素,32位纹理) 这是我的“ontop”纹理。(256 x 256像素,32位纹理) 我想要的效果。一个简单的基础纹理和另一个纹理在上面,当然是透明的工作 以及目前的结果。在纹理之间混合,在纹理的“点”处稍微亮一点 我试过几种不同的解决办法。这来自renderer,我的类实现了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.
显然出了问题。因为您是从着色器中混合这两种纹理,所以混合函数与此无关 当前着色器只添加了两种颜色,这与绘制两个网格时相同,第二种颜色使用
GL\u one,GL\u one
实际上,您希望第二个纹理根据其alpha完全替换第一个纹理,就像您绘制了两个网格一样,第二个纹理使用GL\u SRC\u alpha,GL\u one\u减去\u SRC\u 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和着色器的信息!再次感谢您!
gl_FragColor = vec4(mix(bodyColor.rgb, addColor.rgb, addColor.a), 1.0);