Неверное отображение текстуры на кубе

Я создал куб, а затем изменил его координаты, чтобы сделать его таким, как этот луч (нажми на меня).

Я уверен, что текстура загружается нормально, так как я успешно загрузил другие текстуры в проекте (используя SOIL).

Код луча таков:

glBindTexture(GL_TEXTURE_2D, obstacle_texture);
glBegin(GL_QUAD_STRIP);
// front
glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, 0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, height, 0.0f);
glTexCoord2f(0.0f, 1.0f );  glVertex3f(0.0f, height, 0.0f);
// back
glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, -side);
glTexCoord2f(0.0f, 1.0f);   glVertex3f(side, 0.0f, -side);
glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, height, -side);
glTexCoord2f(1.0f, 1.0f);   glVertex3f(0.0f, height, -side);
// right
glTexCoord2f(0.0f, 0.0f);   glVertex3f(side, 0.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f);   glVertex3f(side, 0.0f, -side);
glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, height, -side);
glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, height, 0.0f);
// left
glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f);   glVertex3f(0.0f, 0.0f, -side);
glTexCoord2f(1.0f, 0.0f);   glVertex3f(0.0f, height, -side);
glTexCoord2f(1.0f, 1.0f);   glVertex3f(0.0f, height, 0.0f);
// top
glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, height, 0.0f);
glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, height, 0.0f);
glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, height, -side);
glTexCoord2f(0.0f, 1.0f);   glVertex3f(0.0f, height, -side);
// bottom
glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f);   glVertex3f(side, 0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, 0.0f, -side);
glTexCoord2f(0.0f, 1.0f);   glVertex3f(0.0f, 0.0f, -side);
glEnd();

Результат таков:

beam_wrongTextureMapping

Там должно быть что-то не так с отображением текстуры ИЛИ ЖЕ
Я должен был оставить куб как есть и применить к нему текстуру, а затем масштабировать ее (но я думаю, что это приведет к искажению текстуры).

Что я должен делать?

Обновление № 1:
До SOIL я использовал загрузчик BMP-файлов, которые я нашел на сайте.
Я использовал это сейчас, и это выглядит так:

введите описание изображения здесь

Обратите внимание, что кажется, что у куба есть несколько треугольных ячеек, на которые я указал.
Я использую ПОЧВУ так:

GLuint tex_2d = SOIL_load_OGL_texture
(
imagepath,
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
);
glBindTexture(GL_TEXTURE_2D, tex_2d);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

1

Решение

Итак, как минимум три проблемы здесь.

Вы отрисовываете четырехугольную полосу, но задаете координаты, как будто вы отрисовываете отдельные четырехугольники. Таким образом, вы получите дополнительные примитивы. Это не источник ваших проблем, но вы где-то выплевываете плохую геометрию.

Некоторые из UV-координат кажутся отключенными — на некоторых гранях координаты проходят вокруг грани, тогда как в других координаты зигзагообразны.

Вот ваши первые два лица:

glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, 0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, height, 0.0f);
glTexCoord2f(0.0f, 1.0f );  glVertex3f(0.0f, height, 0.0f);

glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, -side);
glTexCoord2f(0.0f, 1.0f);   glVertex3f(side, 0.0f, -side);
glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, height, -side);
glTexCoord2f(1.0f, 1.0f);   glVertex3f(0.0f, height, -side);

На второй грани две средние координаты УФ противоположны по диагонали, но не так на первой. Только один из них может быть правильным, поэтому на лице, которое не является правильным, вы получите плохое текстурирование.

Ваша проблема с загрузкой текстуры, вероятно, будет проблемой заполнения, так как загружаемая текстура имеет другое требование заполнения, чем то, что ожидает GL (GL по умолчанию ожидает, что строки данных текстуры будут дополнены до 4 байтов). Либо сообщите GL, как дополняется ваша текстура, либо измените текстуру так, чтобы она соответствовала (вот почему ваша текстура BMP работает лучше — требования к заполнению для BMP по совпадению работают с GL).

Возможные исправления для этого:

  • Расскажите GL, как упакована ваша текстура, используя (например) glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  • Измените размеры вашей текстуры так, чтобы отступы не менялись.
  • Измените загрузку вашей текстуры так, чтобы отступы соответствовали ожиданиям GL

Я подозреваю, что здесь может быть что-то не так, потому что у вас появляется странная желтая полоса и то и другое текстуры BMP и PNG, но я бы сначала исправил очевидные проблемы.

Наконец, стандартный совет — избегайте конвейера с фиксированными функциями старого стиля с индивидуальной передачей вершин, используйте VBO и рисуйте вызовы.

4

Другие решения

Других решений пока нет …