2011-10-18 58 views
5

假设我从给定的文件中加载一个字节数组作为RGB。必须翻转OpenGL纹理吗?

我读过OpenGL喜欢存储它的纹理“反转”,并且我看到演示程序存储他们的图像翻转颠倒。

所以在我的程序中,我必须按字节或逐行反转加载的RGB阵列字节吗?

回答

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文件,你MUST翻转图像通过手动将它发送到OpenGL的(其中大部分.BMP装载机做)之前,的unflipped图像发送到OpenGL并在渲染代码之前添加上面的代码。

+0

对,实际上所有翻转的图像都是BMP。但是,OpenGL如何获取纹理坐标呢? (0,0)在最后一行的第一个像素处,我是对的,(1,1)是第一行的最后一个像素?我不需要翻转阵列,这是正确的? –

+0

嗯,这取决于!如果你只是取得原始BMP数据并发送给OpenGL,那么是的,(0,0)突然成为第一行的第一个像素。如果你想(0,0)再次成为第一行的最后一个像素,你必须在将数组发送到OpenGL之前翻转数组。另一种方法是上面的纹理矩阵缩放代码。 –

+0

@catfish_deluxe_call_me_cd不! (0,0)是第一行中的第一个像素。只是在OpenGL中,图像的行从下到上排序,但原点仍然在图像数据第一行的第一个像素中,您可以发送给OpenGL。 –