Android GLES 2.0:帧缓冲渲染到半浮点纹理适用于某些设备,而不是其他设备

时间:2014-12-09 19:42:31

标签: android opengl-es-2.0 framebuffer render-to-texture

在Android上使用GLES 2.0,我试图渲染到由纹理支持的帧缓冲区。纹理和帧缓冲区的创建方式如下:

final int GL_RGB16F_EXT = 0x881B;
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGB, width, height, 0,
        GL_RGB16F_EXT, type, null);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
    GLES20.GL_TEXTURE_2D, textureHandle, 0);

对于type=GL_HALF_FLOAT_OES,这适用于某些设备,但在其他设备上提供GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT状态。

使用GL_NEAREST缩小和放大模式创建纹理。

请注意,在某些设备(Nexus 5)上,只有当我使用“GL_RGB”代替“GL_RGB16F_EXT”作为内部格式时才能使用上述功能(Nexus 6/7)仅适用于GL_RGB16F_EXT,有些适用于(Nexus 9),有些适用于(Nexus 4)。

奇怪的是,我的所有设备(包括失败的设备)都会报告GL_OES_texture_half_floatGL_EXT_color_buffer_half_float

我还能在这里找到什么?

1 个答案:

答案 0 :(得分:0)

我相信ES 2.0的正确参数组合是:

final int GL_HALF_FLOAT_OES = 0x8D61;
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGB, width, height, 0,
        GLES20.GL_RGB, GL_HALF_FLOAT_OES, null);

不幸的是,ES 2.0不支持glTexImage2D()的大小内部格式。它从格式/类型参数派生内部格式。 ES 3.0中添加了大小的内部格式。

根据EGL_color_buffer_half_float specGL_RGB16F_EXT仅支持glRenderbufferStorage()的内部格式。