Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LIBGDX-着色器中不需要的纹理混合_Java_Android_Opengl Es_Libgdx_Shader - Fatal编程技术网

Java 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的着色器:

我正在尝试将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);