在OpenGL ES 2.0中编写深度缓冲区/深度值的解决方法

时间:2012-07-05 06:56:43

标签: android opengl-es-2.0

我需要在Android设备(OpenGL ES 2.0)上写入深度缓冲区。由于gl_FragDepth在OGL ES 2.0下不可写,我必须找到一种解决方法。我实际上想通过光线投射渲染球体,类似于:http://www.sunsetlakesoftware.com/2011/05/08/enhancing-molecules-using-opengl-es-20。 但是,在本网站上解释的解决方案(使用特殊glBlendEquation编写深度的屏幕外渲染通道)仅适用于Apple设备,而不适用于Android,因为GL_MIN_EXT - 不支持混合。

在我的Tegra3平板电脑上,我能够实现此方法:Android GLES20.glBlendEquation not working?(顺便说一句,我建议使用线性化的深度值,它们会产生更好的结果!) 它工作得很好,但当然这只适用于Nvidia GPU。

理论上,有GL_EXT_frag_depth扩展名(请参阅Can an OpenGL ES fragment shader change the depth value of a fragment?),但在Android设备上也无法使用。

最后,您当然可以只为一个球体编写深度缓冲区(在屏幕外渲染过程中),然后在第二个渲染过程中为下一个球体写入深度缓冲区,并在第三个渲染过程中将两者结合起来。在这样做时,你将获得n个球体的2 * n + 1个渲染过程 - 这似乎效率很低!

因为我的想法已经不多了,我的问题是:你能想到在OpenGL ES 2.0 Android设备上编写深度缓冲区的另一种通用方式/解决方法吗?

1 个答案:

答案 0 :(得分:2)

嗯,你肯定在这里没有选择。我不知道有任何进一步的解决方法,因为我不太了解Opengl ES。

我唯一想到的就是将蛮力多次通过方法与一些预处理相结合:

将球体分组成原子彼此不重叠的组。应该可以在少于10组的蛋白质中对所有球体进行分类。然后在一次通过中渲染每组的所有球体。这里顶点深度足够,因为球体不重叠。然后你可以“深度融合”结果。

这需要一些预处理,这可能是一个问题。

相关问题