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