Java 如何在Android上使用OpenGL ES扩展

Java 如何在Android上使用OpenGL ES扩展,java,android,opengl-es,opengl-es-3.0,Java,Android,Opengl Es,Opengl Es 3.0,我正在Android上开发一个OpenGL ES 3.0应用程序,主要是Java,我需要使用浮点渲染纹理 GLES30.glGetString(GLES30.GL_EXTENSIONS) 返回一个包含GL\u EXT\u color\u buffer\u half\u float和GL\u EXT\u color\u buffer\u float等的字符串=>显然,我的设备支持浮点纹理 然而,我现在有点不知道如何使用这些扩展。 召唤 结果是glError 1282。当我使用GL_RGBA而不是

我正在Android上开发一个OpenGL ES 3.0应用程序,主要是Java,我需要使用浮点渲染纹理

GLES30.glGetString(GLES30.GL_EXTENSIONS)
返回一个包含GL\u EXT\u color\u buffer\u half\u float和GL\u EXT\u color\u buffer\u float等的字符串=>显然,我的设备支持浮点纹理

然而,我现在有点不知道如何使用这些扩展。 召唤

结果是glError 1282。当我使用GL_RGBA而不是GL_RGBA16F时,一切都正常。 我想试试GL_RGBA16F_EXT,但它不包含在GLES30中。所以,我试图传递值0x881A,我想这就是GL_RGBA16F_EXT的定义。但是,同样的错误:glError 1282


有一个函数eglGetProcAddress,它有时需要使用OpenGL ES扩展,但由于我不需要函数的地址,我怀疑这对我也没有帮助。我真的不知道下一步该做什么。如何创建浮点FBO?

GL\u UNSIGNED\u BYTE
对于
glTexImage2D()
type
参数以及
GL\u RGBA16F
参数的
值无效

根据规范中的表3.2,
GL_RGBA16F
的唯一有效
type
值为
GL_HALF_FLOAT
GL_FLOAT
。这个电话应该可以:

GLES30.glTexImage2D(GLES30.GL_TEXTURE_2D, 0, GLES30.GL_RGBA16F, 512, 512, 0,
                    GLES30.GL_RGBA, GLES30.GL_HALF_FLOAT, null);
与完整的OpenGL不同,OpenGL ES对于
glTexImage2D()
的有效
格式
/
类型
/
内部格式
组合的设置相当有限。除了规范表3.2中列出的值组合之外,它不支持作为此调用一部分的数据类型自动转换

这些
类型
内部格式
值仍然必须形成有效的组合,即使调用中没有指定数据。主要是因为。。。它就是这样定义的。在我个人看来,整个
glTexImage2D()
从来都不是一个好的API设计,而且它在一定程度上也受到了时间演变方式的影响。较新的
glTexStorage2D()
更干净


例如,在这种特定情况下,
internalFormat
确实完全指定了纹理的存储格式,因为
GL\u RGBA16F
是一种大小格式。因此,
类型
似乎是多余的。但是为了向后兼容,仍然支持旧的非尺寸格式。假设您为
internalFormat
指定
GL\u RGB
,如果将
GL\u RGB8
内部格式与
GL\u UNSIGNED\u BYTE
组合用于
类型
,纹理将使用
GL\u RGB565
GL\u UNSIGNED\u SHORT\u 5
,那么它将是
GL\u RGB565
。谢谢我认为,类型参数与数据参数相关联,因此,我为类型指定什么并不重要,因为data=null。显然,我误解了其中的一些内容-类型参数有哪些影响?internalFormat不是规定了GPU需要知道的一切吗?添加了一些内容来尝试解释这一点。尽管如此,从逻辑上解释它还是有点困难,因为这些API的定义方式完全是一团糟。
GLES30.glTexImage2D(GLES30.GL_TEXTURE_2D, 0, GLES30.GL_RGBA16F, 512, 512, 0,
                    GLES30.GL_RGBA, GLES30.GL_HALF_FLOAT, null);