OpenGL: glTexImage2D конфликтует с glGenLists & glCallList? - PullRequest
0 голосов
/ 27 апреля 2009

У меня есть простое приложение OpenGL, в котором на экране отображаются 2 объекта:

1) система частиц, где каждая частица отображается на текстуру с помощью вызова glTexImage2D (). В функции drawEvent я рисую его как GL_TRIANGLE_STRIP с 4 glVertex3f.
2) трехмерный текст загружается из объектного файла, где каждая точка загружается с использованием glNewList / glGenLists и сохраняет каждую точку как glVertex. Я рисую это, вызывая glCallList.

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

Если я не вызываю glTexImage2D, я вижу и 3D текст, и систему частиц. В этом случае система частиц выглядит ужасно, потому что я не текстурировал карту ни с чем. (это ожидается)

Кто-нибудь знает, почему использование списка вызовов и glTexImage2D может конфликтовать друг с другом?

РЕДАКТИРОВАТЬ я также забыл упомянуть: я вызываю glBindTexture (GL_TEXTURE_2D, this-> texture); внутри drawLoop до вызова системы частиц.

EDIT2 я вызываю glTexImage2D () только один раз при запуске системы (когда я наносил текстуру на растровое изображение)

Ответы [ 3 ]

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

glTexImage2D загружает текстуру в видео-память (упрощенно сказано).

Если OpenGL позволит вам разместить вызов glTexImage2D внутри списка, он также должен был сохранить данные пикселей в списке. Что произойдет, если вы выполните список? Вы бы загружали одни и те же данные изображения в одну и ту же текстуру.

Это не имеет смысла, поэтому оно не учитывается.

Если вы хотите изменить текстуры между вызовами отрисовки, используйте glBindTexure. Этот вызов устанавливает текущую текстуру. Это намного быстрее.

Что касается загрузки изображений через glTexImage2D: делайте это только один раз для каждой текстуры. Либо в начале вашей программы (если она небольшая), либо каждый раз, когда вы загружаете новый контент с диска.

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

Это может не быть конфликт glTexImage2D и glCallList вообще. Твоё наложение текстур нормально? Вы установили координаты текстуры заранее? Попробуйте проверить соответствие координат вершины и текстуры.

0 голосов
/ 02 апреля 2014

Я уже решаю эту проблему. Перед использованием GL_TEXTURE_2D, вам нужно установить enable function => glEnable (GL_TEXTURE_2D); И прежде чем использовать glCallList, вам также нужно установить disable function => glDisable (GL_TEXTURE_2D);

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