OpenGL 纹理位图偏移问题

问题描述

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

#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,data);

    glMatrixMode(GL_PROJECTION);
    glOrtho(0,-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,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);

    glutdisplayFunc(display);

    glutMainLoop();

    free(data);
    return 0;
}

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

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

后执行它:

./squares

这是我正在使用的图像:

Original

然后这是程序执行后的屏幕截图:

enter image description here

我似乎找不到任何原因。

我还阅读了位图格式,并尝试将 fread() 读取的数据偏移 54 个字节以跳过标题 - 但这没有任何效果

编辑 #1(作者)

我决定进行一些额外的测试。似乎图像从原点(0,0 = 左下角)开始的部分被向上推了 1 个像素,并占据了图像最右侧的 18 个像素。

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

所以,它偏移了 -18,-1 - 但是当它到达图像实际开始的部分时,-1 被重置为 0 ...如果这是有道理的......它不会我。

解决方法

嗯,我觉得很傻。当我说我试图阅读 BMP 的标题时 - 我做错了。或者至少在错误的参数中设置了 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,width * height * 3,file);
    fclose(file);
}