Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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
Opengl es OpenGL:alphablending曲面与自身_Opengl Es_Alphablending - Fatal编程技术网

Opengl es OpenGL:alphablending曲面与自身

Opengl es OpenGL:alphablending曲面与自身,opengl-es,alphablending,Opengl Es,Alphablending,在我的(基于Android OpenGL ES的)应用程序中,我需要使用深度测试和混合功能渲染复杂的自阻挡曲面: GLES20.glEnable (GLES20.GL_DEPTH_TEST); GLES20.glEnable(GLES20.GL_BLEND); GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 下面可以看到一个示例应用程序的视频,该应用程序渲染一个完全不透明(alpha-1.0)的平面

在我的(基于Android OpenGL ES的)应用程序中,我需要使用深度测试和混合功能渲染复杂的自阻挡曲面:

GLES20.glEnable (GLES20.GL_DEPTH_TEST);
GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
下面可以看到一个示例应用程序的视频,该应用程序渲染一个完全不透明(alpha-1.0)的平面,其中有一个气泡从中生长出来:

如您所见,当气泡达到最大高度时,其顶部会阻挡其下方部分曲面。如果仔细观察,您将看到只有气泡的下半部分正确渲染,而气泡的上半部分最终大部分透明,下面的表面不透明,这在视觉上是不正确的

现在,我想我知道了为什么会发生这种情况:这是因为片段呈现到屏幕上的顺序。碎片必须从下到上绘制,因此在下半部分的情况下,首先渲染下面的背景,整个场景看起来是正确的;然而,在上半部分的情况下,首先渲染的是气泡,然后渲染它下面的背景,因此背景的碎片实际上最终成为图像中的源

GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
因此,它们最终是不透明的(即使它们离相机更远,并且应该被气泡阻挡)

所以我知道会发生什么,但我不知道如何修复它。看起来,当“混合”打开时,即使启用了“深度测试”,距离摄影机较远的碎片仍会阻碍较近的碎片

解决此问题的一种方法是关闭混合,这确实可以使气泡正确渲染。但是我不能这样做(或者我想我不能?),因为还有一个额外的要求:有可能(可能是自阻挡的)曲面在顶部或另一个曲面上渲染,并且它的部分可以是半透明的,在这种情况下,我确实希望将它们与下面的曲面混合

因此,本质上,我希望能够渲染曲面,以便:

  • 在开始渲染之前,它会与帧缓冲区中的任何内容混合
  • 它不能与自身融合

  • 有什么提示吗?

    fbo有乒乓渲染技术……事实上,通过阅读我自己,我意识到我想要的是glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA)的等价物,但来源总是离相机更近的片段(z值更低)。无论片段的渲染顺序如何,这种混合方式都是正确的。实际上,在我看来,这将是一个显而易见的功能,OpenGL硬件可以非常便宜地实现它,但在搜索它之后,看起来OpenGL根本不支持它……它不直接支持它。有很多方法,比如深度剥离。我在这里的回答中概述了一些常见的透明度渲染方法:。