Каковы обычные шаги устранения неполадок для текстур OpenGL, которые не отображаются?

После внесения нескольких изменений в мое приложение, мои текстуры больше не отображаются. Пока я проверил следующее:

  • Направление камеры не изменилось.
  • Я вижу векторы (когда они окрашены вместо текстурированных).

Любые обычные подозреваемые?

Ответ 1

Вы можете проверить следующее:

  • glEnable(GL_TEXTURE_2D); наличие

  • glBindTexture(GL_TEXTURE_2D, texture[i]); и glBindTexture(GL_TEXTURE_2D, 0); когда вам больше не нужна текстура

Ответ 2

Еще несколько вещей, которые нужно проверить:

  • glColorMaterial (...); Чтобы убедиться, что цвета не переписывают текстуру
  • glEnable/glDisable (GL_LIGHTING); Иногда освещение может стирать текстуру.
  • glDisable (GL_BLEND); Убедитесь, что вы не смешиваете текстуру
  • Убедитесь, что координаты текстуры установлены правильно.

Ответ 3

Помогает ли glColor3ub (255,255,255) перед рендерингом вашего текстурированного объекта? Я думаю, что состояние OpenGL по умолчанию умножает текущий glColor на входящий texel; блуждающий glColor3ub (0,0,0) заставит все ваши текстуры выглядеть черными.

Ответ 4

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

Если вы делаете объектно-ориентированный код, вы можете захотеть, чтобы генерация текстуры произошла, когда поток, который фактически выполняет ничью, инстанцируется, другими словами: избегайте делать это в конструкторах или вызове, исходящем от конструктора, это может экземпляр вашего объекта текстуры перед окном или приложение, которое будет использовать его, включено.

Что я обычно делаю, так это то, что я создаю ручную функцию Init для создания текстуры, которая вызывается в функции Init приложения. Поэтому я гарантирую, что приложение существует, когда происходит привязка.

Дополнительная информация здесь: http://www.opengl.org/wiki/Common_Mistakes#The_Object_Oriented_Language_Problem

Ответ 5

Одной из распространенных проблем, с которой я сталкиваюсь время от времени, является

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

но я забыл предоставить mipmaps. Quickfix:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

Ответ 6

Мне понадобилось некоторое время, чтобы понять это...

glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
glDisable(GL_TEXTURE_GEN_Q);

Также обязательно отвяжите свои вещи:

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);

Если вы используете сторонний движок, который оптимизирован, он, вероятно, имеет уровень прямого доступа к OpenGL (чтобы не использовать медленные функции запросов OpenGL). Если это так, не вызывайте OpenGL напрямую, а используйте обертки. В противном случае ваш код не будет хорошо работать с остальной частью кода двигателя.