繁体   English   中英

Android GLES 2.0:将帧缓冲区渲染为半浮点纹理可在某些设备上使用,而在其他设备上则无法使用

[英]Android GLES 2.0: framebuffer rendering to half-float texture works on some devices, not others

我正在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

我还能在这里错过什么?

我相信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规范 ,仅支持GL_RGB16F_EXT作为glRenderbufferStorage()的内部glRenderbufferStorage()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM