使用帧缓冲区渲染纹理时,纹理显示为颠倒,这里是顶点和纹理坐标。顺便说一下,在不创建帧缓冲区的情况下渲染可以正确渲染纹理
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 纹理,这将增加另一个翻转,并且与您的纹理坐标翻转一起抵消。
因此,面对常规纹理代码路径,很有可能被"翻转"。