【问题标题】:Android: Negative values for offscreen texture gets clamped to 0Android:屏幕外纹理的负值被限制为 0
【发布时间】:2016-08-19 20:48:43
【问题描述】:

我正在对 2D 纹理使用离屏渲染。 我的第一个着色器将输出 YUV 值,第二个片段着色器从屏幕外纹理读取 YUV。 在第二个着色器中,我操纵 U 和 V 并将其设置在 -0.5 到 0.5 之间。但是一旦我尝试渲染它,这些就会被限制在 0 到 1(正)。我所有的负值都变成了 0。

发现问题出在这里:

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA,
                width, height, 0, GLES20.GL_RGBA,
                GLES20.GL_UNSIGNED_BYTE, null)

如果我使用 GL_FLOAT 而不是 GL_UNSIGNED_BYTE,它会给我错误,因为颜色格式不匹配。 从链接中,https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml 看起来所有支持的格式都将限制在 0-1 范围内。 如何在下一个纹理中也获得负值。

发现我可以使用其他图像格式,如 GL_R16F,但 GLES20 中的链接 / 不支持它们。

【问题讨论】:

    标签: opengl-es-2.0 fragment-shader texture-mapping texture2d off-screen


    【解决方案1】:

    继续使用 GL_UNSIGNED_BYTE 是否会更好,但只需将 UV 值从 -1 到 1 范围重新映射到 0 到 1 范围,然后再将它们写入第一个着色器。然后在第二个着色器中读取它们之后,从 0 到 1 范围映射回 -1 到 1 范围。

    这只是在每个着色器中进行额外的乘加,并且会节省大量的纹理内存/带宽。

    例如着色器结束 1

    vShader1Output = vUVBetweenNeg1And1 * vec2(0.5, 0.5) + vec2(0.5, 0.5);
    

    例如着色器 2 的开始

    vShader2Input = vUVFromShader1Texture * vec2(2.0, 2.0) - vec2(1.0, 1.0)
    

    【讨论】:

      【解决方案2】:

      我可以通过以下更改来解决问题:

      最终整数 GL_HALF_FLOAT_OES = 0x8D61;

      GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 宽度,高度,0,GLES20.GL_RGBA, GL_HALF_FLOAT_OES, null);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 2013-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        相关资源
        最近更新 更多