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