我在使用OpenGL ES 2.0的android项目中实现了阴影映射(使用java,而不是NDK)。我使用的是eclipse adt 2014_07_02版本。
症状是靠近的物体不会在地面上投射阴影。经过一番尝试,我意识到与FBO相连的16位深度缓冲区需要更高的精度。
我设置了深度缓冲区附件,如下所示:
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER,
GLES20.GL_DEPTH_COMPONENT16, width, height);
现在的问题是,似乎没有这样的常数GL_DEPTH_COMPONENT24
。我用它搜索了实际的枚举代码(33190),并用该代码替换了GL_DEPTH_COMPONENT16,并且一切正常,阴影良好且精确。
我的问题是,使用此代码(SDK中未定义)是否安全,否则可能无法在其他手机上使用?
我的计划是使用glGetError()实现一些try-catch机制,并回退到16位depthbuffer。这可以工作吗?
GL_DEPTH_COMPONENT24
不是核心ES 2.0的一部分。使用它需要支持GL_OES_depth24扩展的设备。它包含以下定义:
DEPTH_COMPONENT24_OES 0x81A6
转换为十进制,这是您使用的33190值。由于它可以在您的设备上使用,因此它似乎支持该扩展程序。这并不奇怪,因为它得到了广泛的支持。ES 3.0需要支持24位深度缓冲区,因此任何可以支持ES3的GPU都具有必要的硬件功能,并且可以选择通过扩展将该格式公开给ES 2.0应用。
为了使您的代码可移植,干净的解决方案是检查扩展名是否存在。您可以通过调用来做到这一点glGetString(GL_EXTENSIONS)
,并检查是否OES_depth24
在返回的字符串中显示。
确认支持扩展后,Android框架中值的定义为GLES11Ext.GL_DEPTH_COMPONENT24_OES
(documentation)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句