1

使用帧缓冲区 渲染纹理时出现倒置,这里是顶点和纹理坐标。顺便说一句,在不创建帧缓冲区的情况下渲染可以正确地渲染纹理

private final float[] mVerticesData =
    { 
            -1f, 1f, 0.0f, // Position 0
            0.0f, 0.0f, // TexCoord 0
            -1f, -1f, 0.0f, // Position 1
            0.0f, 1.0f, // TexCoord 1
            1f, -1f, 0.0f, // Position 2
            1.0f, 1.0f, // TexCoord 2
            1f, 1f, 0.0f, // Position 3
            1.0f, 0.0f // TexCoord 3
    };

任何帮助请...谢谢

4

2 回答 2

4

将 2D 纹理图像上传到 OpenGL 时,它期望数据从下到上指定,即使通常图像在内存中是从上到下的。您似乎已反转纹理坐标以解决此问题。

您应该在将纹理数据上传到 OpenGL 之前翻转纹理数据并保持纹理坐标不变。如果这样做,相同的纹理坐标适用于图像和 FBO 纹理。

所以解决方案是在调用 GLUtils.texImage2D 之前翻转位图并将顶点写为

private final float[] mVerticesData =
    { 
        -1f, 1f, 0.0f, // Position 0
        0.0f, 1.0f, // TexCoord 0
        -1f, -1f, 0.0f, // Position 1
        0.0f, 0.0f, // TexCoord 1
        1f, -1f, 0.0f, // Position 2
        1.0f, 0.0f, // TexCoord 2
        1f, 1f, 0.0f, // Position 3
        1.0f, 1.0f // TexCoord 3
    };
于 2012-08-08T11:48:36.840 回答
1

顺便说一句,在不创建帧缓冲区的情况下渲染可以正确地渲染纹理

我认为实际上并没有。将所有变换设置为与顶点坐标匹配的标识和纹理坐标,即 S=X,T=Y,OpenGL 假定纹理数据的原点位于左下方(立方体贴图除外,它们是不同的野兽)。帧缓冲区颜色附件,在您的情况下,您的纹理,同意该约定。

您的纹理 T 坐标与 Y 顶点坐标反平行,这意味着在所有身份转换设置的情况下,您将其“倒置”。

但是,大多数图像文件格式都假定原点位于左上角,如果您将此类数据按原样上传到 OpenGL 纹理,则会添加另一个翻转,并且与纹理坐标翻转一起取消。

所以很有可能,你的常规纹理代码路径被“翻转”了。

于 2012-08-08T09:55:57.947 回答