OpenGL纹理必须翻转吗?

5
假设我从给定的文件中加载了一个字节数组作为RGB。我了解到OpenGL喜欢“翻转”存储纹理,我也看过演示程序将它们的图像上下翻转存储。
因此,在我的程序中,我是否需要逐字节或逐行翻转已加载的RGB数组?
1个回答

6
这是因为位图(.bmp)格式将其行倒置存储。我不确定是谁想出了这个方法,但这是文件格式的事情。所以如果你使用自己的.bmp加载器,是需要这么做的。然而,你可以使用已经编写好了的能够为你“翻转”图像的加载器。再次强调,这只是.bmp格式的事情。OpenGL默认支持非翻转图像。
以下是一个小技巧:如果你不想改变你的.bmp加载器,你可以告诉OpenGL为你翻转图像。
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glScalef(1.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);

这就是我所说的“默认情况”。如果您想的话,可以颠倒OpenGL。然而,这只适用于当你加载 .bmp 文件时。其他文件格式会正确地存储它们的行。因此,我更喜欢第一种方法 - 使用真正的 .bmp 加载器。 只是为了明确:如果您加载 .bmp 文件,您必须在将其发送到OpenGL之前手动翻转图像(大多数 .bmp 加载器都会这样做),或者将未翻转的图像发送到OpenGL并在渲染代码之前添加上述代码。

是的,实际上所有翻转后的图像都是BMP格式。但是OpenGL如何获取纹理坐标呢?(0,0)在最后一行的第一个像素位置,(1,1)在第一行的最后一个像素位置,我说的对吗?难道我不需要翻转数组才能得到正确的结果吗? - catfish_deluxe_call_me_cd
这要看情况!如果你只是将原始BMP数据发送到OpenGL,那么是的,(0,0)突然变成了第一行中的第一个像素。如果你想让(0,0)再次成为第一行中的最后一个像素,你需要在发送到OpenGL之前翻转数组。另一种选择是上面的纹理矩阵缩放代码。 - Raphael R.
@catfish_deluxe_call_me_cd 不是的!(0,0)是第一行的第一个像素。只是在OpenGL中,图像的行是从下到上排序的,但原点仍然在您发送给OpenGL的图像数据的第一行第一个像素位置。 - Christian Rau
3
实际上,DIB文件格式(这就是它的实际名称)支持向上和向下的行排序。如果高度标头字段为负,则向下排序;如果为正,则向上排序。 - datenwolf
1
请记住,翻转纹理的技巧依赖于固定功能管线,而您现在不应该使用它.. ;) - Gigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接