Opengl es render to textture 看起来是颠倒的



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

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
    };

请提供任何帮助...谢谢

将 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
    };

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

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

纹理 T 坐标与 Y 顶点坐标反平行,这意味着在全标识转换设置的情况下,您可以将其"颠倒"翻转。

但是,大多数图像文件格式假定原点在左上角,如果您将此类数据原样上传到 OpenGL 纹理,这将增加另一个翻转,并且与您的纹理坐标翻转一起抵消。

因此,面对常规纹理代码路径,很有可能被"翻转"。

相关内容

最新更新