2012-07-05 121 views
7

我需要在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 -blending不受支持。在OpenGL ES 2.0中写入深度缓冲区/深度值的解决方法

在我的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设备上也不可用。最后,你当然可以为一个球体写入深度缓冲区(在离屏渲染过程中),然后在第二个渲染过程中写入下一个球体的深度缓冲区,并在第三个渲染过程中合并这两个球体。在这样做的时候,你会有2 * n + 1个n球的渲染通道 - 这似乎效率很低!

所以,因为我用完了想法,我的问题是:您是否可以考虑另一种通用方法/解决方法来在OpenGL ES 2.0 Android设备上编写深度缓冲区?

回答

2

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

是进入我脑海的唯一事情是蛮力多遍的方法与一些预处理结合:

排序的球进入其中原子相互不重叠的组。应该可以在10个以内的小组中对蛋白质中的所有球体进行分类。然后渲染每个组的所有球体一次。这里的顶点深度是足够的,因为球体不重叠。然后你可以“深入混合”结果。

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

+0

这听起来像一个有趣的选择!没有我期望的那么优雅的解决方案,但似乎没有其他的......我可能会试一试。对于大多数蛋白质和其他小分子,深度排序应该足够快。 – kroneml