2014-09-03 75 views
0

我正在开发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?

回答

1

GL_UNSIGNED_BYTE是不适合的组合中的type参数的glTexImage2D()与用于internalFormat参数的值GL_RGBA16F一个有效值。

根据规范中的表3.2,GL_RGBA16F的唯一有效type值为GL_HALF_FLOATGL_FLOAT。此调用应该工作:

GLES30.glTexImage2D(GLES30.GL_TEXTURE_2D, 0, GLES30.GL_RGBA16F, 512, 512, 0, 
        GLES30.GL_RGBA, GLES30.GL_HALF_FLOAT, null); 

与完整的OpenGL,Op​​enGL ES的有glTexImage2D()一组相当有限的有效format/type/internalFormat组合。作为本次调用的一部分,它不支持数据类型的自动转换,超出了规范表3.2中列出的值组合。

这些typeinternalFormat值仍然必须形成有效组合,即使在调用中没有指定数据。主要是因为......它是这样定义的。在我个人看来,这整个glTexImage2D()从来都不是一个好的API设计,它也部分地受到它随着时间的推移而变化的方式。较新的glTexStorage2D()更清洁。

例如,在这种特定情况下,internalFormat确实会完全指定纹理的存储格式,因为GL_RGBA16F是大小格式。所以type似乎是多余的。但为了向后兼容,仍旧支持较旧的未格式化格式。如果指定GL_RGBinternalFormat,纹理会,如果你结合起来,与GL_UNSIGNED_BYTEtype使用GL_RGB8内部格式,但是这将是一个GL_RGB565如果typeGL_UNSIGNED_SHORT_5_6_5说。

+0

哦,你是对的。谢谢!我认为,类型参数与数据参数相关联,因此,我指定的类型无关紧要,因为data = null。显然,我误解了那里的一些东西 - 哪个效果有类型参数?内部格式不指定一切,GPU需要知道? – j00hi 2014-09-04 14:55:09

+1

增加了一些内容来尝试和解释。即使如此,从逻辑上解释它也是很难的,因为这些API的定义方式是一团糟。 – 2014-09-05 06:24:05

相关问题