如何在Android上使用OpenGL ES扩展
我正在开发Android上的OpenGL ES 3.0应用程序,主要是在Java中,我需要使用浮点渲染纹理。如何在Android上使用OpenGL ES扩展
GLES30.glGetString(GLES30.GL_EXTENSIONS)
返回包含GL_EXT_color_buffer_half_float一个字符串,GL_EXT_color_buffer_float等等=>我的设备支持浮点纹理,很明显。
但是,我现在有点迷路了如何使用这些扩展。当我使用GL_RGBA代替GL_RGBA16F 调用
GLES30.glTexImage2D(GLES30.GL_TEXTURE_2D, 0, GLES30.GL_RGBA16F, 512, 512, 0, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, null);
导致一个glError 1282一切正常。 我想尝试GL_RGBA16F_EXT,但这不包含在GLES30中。所以,我想通过价值0x881A这就是GL_RGBA16F_EXT是如何定义的。但是,同样的错误:glError 1282.
函数eglGetProcAddress有时需要使用OpenGL ES扩展,但由于我不需要函数的地址,我怀疑这也不会帮助我。我真的不知道接下来要做什么。我怎样才能创建浮点型FBO?
GL_UNSIGNED_BYTE
是不适合的组合中的type
参数的glTexImage2D()
与用于internalFormat
参数的值GL_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()
一组相当有限的有效format
/type
/internalFormat
组合。作为本次调用的一部分,它不支持数据类型的自动转换,超出了规范表3.2中列出的值组合。
这些type
和internalFormat
值仍然必须形成有效组合,即使在调用中没有指定数据。主要是因为......它是这样定义的。在我个人看来,这整个glTexImage2D()
从来都不是一个好的API设计,它也部分地受到它随着时间的推移而变化的方式。较新的glTexStorage2D()
更清洁。
例如,在这种特定情况下,internalFormat
确实会完全指定纹理的存储格式,因为GL_RGBA16F
是大小格式。所以type
似乎是多余的。但为了向后兼容,仍旧支持较旧的未格式化格式。如果指定GL_RGB
为internalFormat
,纹理会,如果你结合起来,与GL_UNSIGNED_BYTE
为type
使用GL_RGB8
内部格式,但是这将是一个GL_RGB565
如果type
是GL_UNSIGNED_SHORT_5_6_5
说。
哦,你是对的。谢谢!我认为,类型参数与数据参数相关联,因此,我指定的类型无关紧要,因为data = null。显然,我误解了那里的一些东西 - 哪个效果有类型参数?内部格式不指定一切,GPU需要知道? – j00hi 2014-09-04 14:55:09
增加了一些内容来尝试和解释。即使如此,从逻辑上解释它也是很难的,因为这些API的定义方式是一团糟。 – 2014-09-05 06:24:05