1

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

GLES30.glGetString(GLES30.GL_EXTENSIONS)

返回一个包含 GL_EXT_color_buffer_half_float 和 GL_EXT_color_buffer_float 的字符串 => 我的设备显然支持浮点纹理。

但是,我现在有点迷失如何使用这些扩展。打电话

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

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

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

4

1 回答 1

1

GL_UNSIGNED_BYTE不是与参数的值组合的type参数的有效值。glTexImage2D()GL_RGBA16FinternalFormat

根据规范中的表 3.2,唯一有效的type值为和。这个调用应该有效:GL_RGBA16FGL_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 不同format,OpenGL ES对. 它不支持作为此调用的一部分的数据类型的自动转换,超出规范表 3.2 中列出的值组合。typeinternalFormatglTexImage2D()

即使调用中没有指定数据,这些type和值仍然必须形成有效的组合。internalFormat主要是因为……它是这样定义的。在我个人看来,这整体glTexImage2D()从来都不是一个好的 API 设计,而且它也部分地受到了它随着时间的推移而演变的方式的影响。新glTexStorage2D()的更干净。

例如,在这种特定情况下,internalFormat确实完全指定了纹理的存储格式,因为GL_RGBA16F它是一种调整大小的格式。所以这type似乎是多余的。但是为了向后兼容,仍然支持较旧的未调整大小的格式。假设如果您指定GL_RGBfor ,如果您将其与for the结合internalFormat使用,纹理将使用GL_RGB8内部格式,但如果is则它将是 a 。GL_UNSIGNED_BYTEtypeGL_RGB565typeGL_UNSIGNED_SHORT_5_6_5

于 2014-09-03T15:09:59.393 回答