OpenGL 纹理位图偏移问题

OpenGL Texture Bitmap Offset Issue

我正在尝试加载位图图像,然后将其用作纹理以应用于多边形。大部分工作正常,但位图似乎有偏移:

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>

int width = 64;
int height = 64;
unsigned char * data = NULL;

void load_image_data(const char * image_path)
{
    FILE * file = fopen(image_path, "rb");

    if (file == NULL) {
        printf("Unable to open <%s>!\n", image_path);
        exit(1);
    }

    data = calloc(width * height * 3, sizeof(unsigned char));

    fread(data, width * height * 3, 1, file);
    fclose(file);
}

void display(void)
{
    GLuint texture;

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_BGR, GL_UNSIGNED_BYTE, data);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_BGR, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);

    glMatrixMode(GL_PROJECTION);
    glOrtho(0, width, 0, height, -1, 0);

    glClear(GL_COLOR_BUFFER_BIT);

    glBindTexture(GL_TEXTURE_2D, texture);
    glEnable(GL_TEXTURE_2D);
    glBegin(GL_QUADS);
    glTexCoord2i(0, 0);
    glVertex2i(0, 0);
    glTexCoord2i(0, 1);
    glVertex2i(0, height);
    glTexCoord2i(1, 1);
    glVertex2i(width, height);
    glTexCoord2i(1, 0);
    glVertex2i(width, 0);
    glEnd();

    glDisable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 0);
    glFlush();
}

int main(int argc, char ** argv)
{
    load_image_data("squares.bmp");

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(width, height);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Squares!");

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glClearColor(0, 0, 0, 0);

    glutDisplayFunc(display);

    glutMainLoop();

    free(data);
    return 0;
}

我正在使用以下命令编译它:

gcc squares.c -g -o squares -lglut -lGLU -lGL

然后执行:

./squares

这是我正在使用的图像:

下面是程序执行后的截图:

我似乎找不到任何原因。

我也读过位图格式,并尝试将 fread() 读取的数据偏移 54 个字节以跳过 header - 但这没有效果。

编辑 #1(作者):

我决定做一些额外的测试。似乎从原点(0,0 = 左下角)开始的图像部分被向上推了 1 个像素,并占用了图像的 right-most 18 个像素。

这似乎是不变的,无论图像的大小如何。 (目前使用 64x64 像素图像)。

因此,它偏移了 -18,-1 - 但是当它到达图像实际开始的部分时,-1 被重置为 0 ...如果这有意义...它没有'对我来说。

嗯,我觉得很傻。当我说我试图阅读 BMP 的 header 时——我做错了。或者至少在错误的参数中设置 54 字节的偏移量。

无论如何,解决方案是将 load_image_data() 函数更改为以下内容:

void load_image_data(const char * image_path)
{
    FILE * file = fopen(image_path, "rb");
    unsigned char info[54];

    if (file == NULL) {
        printf("Unable to open <%s>!\n", image_path);
        exit(1);
    }

    fread(info, sizeof(unsigned char), 54, file);

    width = *(int *) &info[18];
    height = *(int *) &info[22];

    data = calloc(width * height * 3, sizeof(unsigned char));

    fread(data, sizeof(unsigned char), width * height * 3, file);
    fclose(file);
}