Проблема смещения растрового изображения текстуры OpenGL

#c #opengl #bitmap #texture-mapping #texture2d

#c #opengl #Растровое изображение #отображение текстур #texture2d

Вопрос:

Я пытаюсь загрузить растровое изображение, а затем использовать его в качестве текстуры для применения к полигону. Большая часть этого работает, но растровое изображение выглядит смещенным:

 #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, amp;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(amp;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() , прочитанные by, на 54 байта, чтобы пропустить заголовок, но это не возымело никакого эффекта.

ПРАВКА №1 (по автору):

Я решил провести несколько дополнительных тестов. Кажется, что часть изображения, которая начинается с начала координат (0,0 = нижний левый угол), перемещается на 1 пиксель вверх и занимает то, что было бы самыми правыми 18 пикселями изображения.

Это значение кажется постоянным, независимо от размера изображения. (В настоящее время используется изображение размером 64×64 пикселя).

Таким образом, он смещен на -18, -1, но когда он доходит до той части, где изображение ФАКТИЧЕСКИ начинается, значение -1 сбрасывается на 0 …Если в этом есть смысл… Для меня это не имеет значения.

Комментарии:

1. Почему было удалено так много контекста из моего первоначального вопроса? Просто любопытно

Ответ №1:

Ну, я чувствую себя довольно глупо. Когда я заявил, что пытался прочитать заголовок 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 *) amp;info[18];
    height = *(int *) amp;info[22];

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

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