【问题标题】:Must OpenGL textures be flipped?必须翻转 OpenGL 纹理吗?
【发布时间】:2011-10-18 17:21:04
【问题描述】:

假设我从给定文件加载一个字节数组作为 RGB。

我听说 OpenGL 喜欢“反转”存储其纹理,并且我看到存储图像的演示程序颠倒过来。

那么在我的程序中,我必须逐字节或逐行反转加载的 RGB 数组吗?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    那是因为 Bitmap(.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) 是第一行的最后一个像素吗?我不需要翻转数组以使其正确吗?
    • 好吧,这取决于!如果你只是把原始的 BMP 数据发送到 OpenGL,那么是的,(0,0) 突然变成了第一行的第一个像素。如果您希望 (0,0) 再次成为第一行中的最后一个像素,则必须在将数组发送到 OpenGL 之前翻转数组。另一种方法是上面的纹理矩阵缩放代码。
    • @catfish_deluxe_call_me_cd 不! (0,0) 是第一行的第一个像素。只是在OpenGL中图像的行是从下到上排序的,但是原点仍然在发送给OpenGL的图像数据的第一行的第一个像素中。
    • 实际上 DIB 文件格式(实际上就是这样)支持向上和向下的行排序。如果高度标题字段为负,则向下,如果为正,则向上。
    • 请记住,所描述的翻转纹理的技巧依赖于固定功能管道,您现在不应该使用它.. ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多