Простая карта текстур OpenGL не работает? - PullRequest
7 голосов
/ 13 апреля 2009

Я пытаюсь понять наложение текстур в OpenGL, и я не могу заставить работать простой пример.

Полигон рисуется, хотя он и не текстурированный, а сплошной цвет. Также растровое изображение корректно загружается в sprite1 [], так как я успешно использовал glDrawPixels до настоящего момента.

Я использую glGenTextures, чтобы получить мое имя tex, но я заметил, что оно не меняет texName1; этот GLuint - это то, к чему я его инициализирую, даже после вызова glGenTextures ...

Я включил GL_TEXTURE_2D.

Вот код:

GLuint texName1 = 0;

glGenTextures(1, &texName1);
glBindTexture(GL_TEXTURE_2D, texName1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, sprite1[18], sprite1[22], 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, &sprite1[54]);

glColor3f(1, 1, 0);
glBindTexture(GL_TEXTURE_2D, texName1);
glBegin(GL_QUADS);
    glTexCoord2f (0.0, 0.0);
    glVertex3f (0.0, 0.0, -5.0f);
    glTexCoord2f (1.0, 0.0);
    glVertex3f (.5, 0.0, -5.0f);
    glTexCoord2f (1.0, 1.0);
    glVertex3f (.5, .5, -5.0f);
    glTexCoord2f (0.0, 1.0);
    glVertex3f (0.0, .5, -5.0f);
glEnd();

UPDATE: Я в недоумении. Вот все, что я пробовал:

  1. Оказывается, я инициализировал свою текстуру до инициализации OGL. Текстура инициализируется (glGenTextures-> glTexImage2D) в конструкторе класса и отрисовывается (glBegin-> glEnd) в функции-члене, которая вызывается в каждом кадре. Похоже, genTextures теперь работает правильно, и я получаю имя 1.

  2. Каждая возможная комбинация GL_RGBA8, GL_BGRA_EXT (GL_BGRA не работает в моей системе; мне нужен _EXT), и я даже удалил альфа-канал из растрового изображения и перепробовал все комбинации GL_RGB, GL_BGR_EXT и т. Д. И т. Д. . Не повезло.

  3. Попытка процедурного создания растрового изображения и его использования

  4. Убедитесь, что GL_COLOR_MATERIAL не включен.

  5. Изменен размер растрового изображения на 32x32.

  6. Пробовал glTexEnvi вместо glTexEnvf.

Ответы [ 7 ]

6 голосов
/ 17 апреля 2009

В дополнение к примечанию Ментата о том, что у вас может возникнуть проблема с размерами текстур не в степени двух, вы упомянули, что генерация имени текстуры не меняла имя.

Звучит так, как будто вы звоните <a href="http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/gentextures.html" rel="nofollow noreferrer">glGenTextures</a>() слишком рано, то есть до инициализации OpenGL. Если это не так, я предлагаю добавить код сразу после вызова glGenTextures(), который проверяет состояние ошибки OpenGL, вызвав <a href="http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/geterror.html" rel="nofollow noreferrer">glGetError()</a>.

3 голосов
/ 17 апреля 2009

В ваших комментариях вы говорите, что ваше растровое изображение имеет размер 29x20 пикселей. На самом деле, чтобы создать правильную текстуру, OpenGL требует, чтобы размер изображения (для каждого измерения) был степенью 2. Это не обязательно должен быть квадрат, хотя это может быть прямоугольник. Вы можете преодолеть это с помощью некоторых расширений OpenGL, таких как GL_ARB_texture_rectangle .

2 голосов
/ 28 июня 2010

Я положу это здесь, так как у меня была та же проблема, и я нашел другой пост, объясняющий проблему. IPhone поддерживает GL_BGRA (GL_EXT_BGRA), но, по-видимому, только как формат ввода, а не как внутренний формат. Итак, если вы измените вызов glTexImage2D на внутренний формат GL_RGBA, он будет работать.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, &sprite1[54]);

Надеюсь, это поможет кому-то еще, кто наткнется на этот пост.

1 голос
/ 19 апреля 2009

Я нашел проблему. Мой звонок на glEnable был glEnable(GL_BLEND | GL_TEXTURE_2D). Используя glGetError, я увидел, что получаю GL_INVALID_ENUM для этого вызова, поэтому я переместил GL_TEXTURE_2D в его собственную функцию включения и бинго. Я думаю, логическое ИЛИ не разрешено для glEnable?

1 голос
/ 14 апреля 2009

Мой OpenGL ржавый, но я помню, что у меня были те же проблемы с glTexImage2D , Наконец мне удалось заставить его работать, но мне всегда больше везло с gluBuild2DMipmaps так что я закончил с

gluBuild2DMipmaps (
  GL_TEXTURE_2D, type, i.width, i.height, type, GL_UNSIGNED_BYTE, i.data
);

который заменил

glTexImage2D (
  GL_TEXTURE_2D, 0, type, i.width, i.height, 0, type, GL_UNSIGNED_BYTE, i.data 
);
1 голос
/ 14 апреля 2009

Несколько случайных идей:

  • Возможно, GL_COLOR_MATERIAL
  • замените "glTexEnvf" на "glTexEnvi" и посмотрите, поможет ли это
  • если texName1 равно 0 после glGenTextures, у вас может не быть активного контекста OpenGL

Для проверки ошибок я рекомендую написать небольшую функцию, которая печатает читаемый вывод для наиболее распространенных результатов из glGetErrors, и использовать ее, чтобы найти строку, которая создает ошибку. Другой возможностью было бы использовать что-то вроде GLIntercept , BuGLe или gDEBugger .

0 голосов
/ 14 апреля 2009

Первым делом я проверю настройку цветового материала, как было упомянуто ShadowIce, затем проверим ваш файл текстуры, чтобы убедиться, что он имеет разумный размер (например, 256x256) и растровое изображение RGB. Если у файла есть даже небольшая проблема, он НЕ БУДЕТ отображаться правильно, независимо от того, как вы пытаетесь.

Тогда я перестану пытаться просто отлаживать этот код и вместо этого посмотрю, чем вы отличаетесь от учебника на сайте NeHe .

NeHe - это всегда хорошее место, чтобы проверить, пытаетесь ли вы что-то делать в OpenGL. Текстуры, вероятно, труднее всего понять, и они становятся все сложнее, когда увеличиваются ваши навыки ГЛ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...