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

标签 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 编写深度的屏幕外渲染 channel )仅适用于 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 设备上也不可用。

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

既然我的想法已经用完了,我的问题是:你能想出另一种通用的方法/解决方法来在 OpenGL ES 2.0 Android 设备上编写深度缓冲区吗?

最佳答案

好吧,您肯定没有其他选择了。我不知道任何进一步的解决方法,因为我不太了解 Opengl ES。

我唯一想到的就是将暴力多遍方法与一些预处理相结合:

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

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

关于android - 在 OpenGL ES 2.0 中写入深度缓冲区/深度值的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11339222/

相关文章:

android - 是否可以将一个 facebook 应用程序深度链接到两个 android 应用程序?

ios - 在结构中传递法线

android - OpenGL ES 2 中 2D 图形的矩阵模式

android - android中integers.xml有什么用

android - 在 Canvas 上绘制一个以触摸点为中心的矩形

c - 纹理四边形(三角形带)OpenGL ES 2.0

android - Genymotion 设备启动并在显示黑屏后消失

android - 将纹理快速加载到 OpenGL 2.0

android - 使用 MockWebServer 暂停功能测试

java - LibGDX:实现触摸屏,无需触摸屏幕