Opengl es渲染到纹理显得颠倒

时间:2012-08-08 09:15:51

标签: opengl-es

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

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

任何帮助请... 感谢

2 个答案:

答案 0 :(得分: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
    };

答案 1 :(得分:1)

  

顺便说一下,渲染而不创建帧缓冲区会使纹理正确

我认为实际上并非如此。将所有变换设置为与顶点坐标匹配的标识和纹理坐标,即S = X,T = Y,OpenGL假定纹理数据的原点位于左下方(具有不同野兽的立方体贴图的可记录例外)。 Framebuffer颜色附件,在你的情况下你的纹理,同意这个约定。

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

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

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