#c #opengl
#c #opengl
Вопрос:
Я рендерю шахматную доску, используя 2 разные текстуры. Один для черных квадратов и один для белых квадратов. Однако вместо того, чтобы каждый отдельный квадрат имел свою собственную текстуру, все они используют последнюю текстуру, которую я связал с вызовом glBindTexture(GL_TEXTURE_2D, id);
.
Это мой подход:
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
// square 0, 0 ( front left )
glBindTexture(GL_TEXTURE_2D, textureBlackSquare->texID);
glNormal3f(0, 1, 0);
glTexCoord2f(0, 0); glVertex3f(-8.0, 0.5, 8.0);
glTexCoord2f(1, 0); glVertex3f(-6.0, 0.5, 8.0);
glTexCoord2f(1, 1); glVertex3f(-6.0, 0.5, 6.0);
glTexCoord2f(0, 1); glVertex3f(-8.0, 0.5, 6.0);
glEnd();
glBegin(GL_QUADS);
// square 1, 0
glBindTexture(GL_TEXTURE_2D, textureWhiteSquare->texID);
glTexCoord2f(0, 0); glVertex3f(-6.0, 0.5, 8.0);
glTexCoord2f(1, 0); glVertex3f(-4.0, 0.5, 8.0);
glTexCoord2f(1, 1); glVertex3f(-4.0, 0.5, 6.0);
glTexCoord2f(0, 1); glVertex3f(-6.0, 0.5, 6.0);
glEnd();
Когда я запускаю этот код, оба квадрата имеют привязку к белой текстуре. Как мне заставить каждый quad иметь свою собственную текстуру?
Комментарии:
1. Пожалуйста, уточните в названии вашего вопроса. В настоящее время никто другой не узнает из него ваш вопрос, и это сообщество , а не сайт поддержки для одноразовых запросов.
2. Еще раз прошу прощения, я не был уверен, что указать в моем названии, и я надеялся, что моя проблема была простым исправлением, которое можно было бы объяснить в одном-двух предложениях. Трудно предсказать масштаб проблемы, когда вы не уверены, в чем проблема в первую очередь.
Ответ №1:
Вы не можете вызвать glBindTexture
в середине glBegin/End
. Вы можете вызывать функции vertex только в пределах begin / end.
Кроме того, почему бы вам просто не создать одну текстуру в виде шахматной доски 8×8, а затем просто отобразить один квадрат, чтобы нарисовать всю шахматную доску?
Комментарии:
1. Я хотел привязать текстуры к каждому квадрату отдельно, потому что моя программа на самом деле интерактивна, и текстуры должны динамически обновляться для каждого квадрата.
Ответ №2:
Из документации:
GL_INVALID_OPERATION
генерируется, еслиglBindTexture
выполняется между выполнениемglBegin
и соответствующим выполнениемglEnd
.
Вы забыли проверить наличие ошибок и, таким образом, пропустили, что ваша программа недействительна.
Комментарии:
1. Примечание: Мне потребовалось 1 минуту и 14 секунд, чтобы просмотреть страницу руководства с помощью Google «glBindTexture» и найти что-нибудь, объясняющее, почему ваш код не работал, а затем записать это здесь.
2. Моя ошибка, я даже не знал о GL_INVALID_OPERATION, поэтому я не знал, чтобы проверить это. Программа выполняется нормально и привязывает текстуры, просто не в том порядке, который я ожидал. Это заставило меня подумать, что это было что-то тривиальное, чего я не понимал в текстурах.
3. @pixelpusher: … это всегда лучшее время, чтобы посмотреть это в документации!
Ответ №3:
Вы не можете привязать текстуру к блоку glBegin-glEnd. Также вам следует избегать переключения текстур, где это возможно, поскольку переключение текстуры является одной из самых дорогостоящих вещей, которые вы можете попросить GPU выполнить (переключение текстуры делает недействительными все кэши выборки texel).
Вместо этого вы сортируете объекты вашей сцены по используемой ими текстуре и группируете их по этому. Итак, сначала вы визуализируете все квадраты шахматной доски, используя первую текстуру (скажем, белую), а после этого все квадраты, используя вторую текстуру (тогда черную).