【问题标题】:Workaround to write depth buffer / depth value in OpenGL ES 2.0在 OpenGL ES 2.0 中写入深度缓冲区/深度值的解决方法
【发布时间】:2012-07-05 06:56:43
【问题描述】:

我需要写入 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。

在我的 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 设备上编写深度缓冲区吗?

【问题讨论】:

    标签: android opengl-es-2.0


    【解决方案1】:

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

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

    将你的球体分成原子不相互重叠的组。应该可以将所有球体从少于十组的蛋白质中分类。然后一次渲染每组的所有球体。顶点深度在这里就足够了,因为球体不重叠。然后你可以“深度混合”结果。

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

    【讨论】:

    • 这听起来很有趣!不像我希望的那样优雅的解决方案,但似乎没有其他的......我可能会试一试。对于大多数蛋白质和其他较小的分子,深度排序应该足够快。
    猜你喜欢
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多