繁体   English   中英

OpenGL 纹理 Bitmap 偏移问题

[英]OpenGL Texture Bitmap Offset Issue

我正在尝试加载 bitmap 图像,然后将其用作纹理以应用于多边形。 其中大部分工作正常,但 bitmap 似乎被抵消了:

#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

这是我正在使用的图像:

原来的

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

在此处输入图像描述

我似乎找不到任何理由。

我还阅读了有关 bitmap 格式的信息,并尝试将fread()读取的数据偏移 54 个字节以跳过 header - 但这没有任何效果。

编辑#1(作者)

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

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

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

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

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

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM