Java Android没有定义GL_深度_组件24?

Java Android没有定义GL_深度_组件24?,java,android,opengl-es,depth,Java,Android,Opengl Es,Depth,我用OpenGLES2.0(使用java,而不是NDK)在android项目中实现了阴影映射。 我使用eclipse adt 2014\u 07\u 02版本 症状是靠近的对象不会在地面上投射阴影。经过一番尝试,我意识到连接到FBO的16位深度缓冲区需要更高的精度 我将深度缓冲区附件设置为: GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, width, he

我用OpenGLES2.0(使用java,而不是NDK)在android项目中实现了阴影映射。 我使用eclipse adt 2014\u 07\u 02版本

症状是靠近的对象不会在地面上投射阴影。经过一番尝试,我意识到连接到FBO的16位深度缓冲区需要更高的精度

我将深度缓冲区附件设置为:

GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER,
            GLES20.GL_DEPTH_COMPONENT16, width, height);
现在,问题是似乎没有像
GL\u DEPTH\u component 24
这样的常数。我在谷歌上搜索了它的实际enum代码(33190),并用该代码替换了GL_DEPTH_组件16,一切都很好,阴影也很精确

我的问题是,使用SDK中未定义的代码是否安全,或者在其他手机上可能不起作用


我的计划是使用glGetError()实现一些try-catch机制,并回退到16位的depthbuffer。这能起作用吗?

它的OpenGL ES功能,而不是Android特有的

字面意思(来自kronos doc):

voidglRenderbufferStorage(格伦目标, 内盂, 格尔斯泽宽度, (身高),

目标:

指定renderbuffer目标。符号常量必须是GL_RENDERBUFFER

内部格式:


指定renderbuffer的颜色可渲染、深度可渲染或模具可渲染格式。必须是以下符号常量之一:GL_RGBA4、GL_RGB565、GL_RGB5_A1、GL_DEPTH_组件16或GL_STENCIL_INDEX8。

GL_DEPTH_组件24
不是核心ES 2.0的一部分。使用它将需要支持的设备。它包含以下定义:

深度组件24\u OES 0x81A6

转换为十进制,这是您使用的33190值。因为它在您的设备上工作,所以看起来它支持扩展。这并不奇怪,因为这得到了相当广泛的支持。ES 3.0要求支持24位深度缓冲区,因此任何支持ES3的GPU都具有必要的硬件功能,并且可以选择通过扩展将此格式公开给ES 2.0应用程序

为了使代码具有可移植性,干净的解决方案是检查扩展是否存在。您可以通过调用
glGetString(GL\u扩展名)
来执行此操作,并检查返回的字符串中是否显示
OES\u depth24


一旦验证了扩展是否受支持,Android框架中的值定义为
GLES11Ext.GL_DEPTH_component 24_OES
()。

为什么不创建几个其他手机的模拟器并尝试一下呢?这似乎是对的,我只是想知道为什么没有定义该常量(不鼓励使用,不支持等)我将尝试使用各种手机和模拟器,并报告。