2014-09-04 1 views
0

Чтобы быть коротким, почему я не мог поставить два glBindTexture в один glBegin (GL_QUADS) ... glEnd()?Состояние GL_QUADS не поддерживает несколько glBindTexture?

Я следую главе 9 OpenGL красной книги, http://www.glprogramming.com/red/chapter09.html

В примере 9-5, программа texbind.c производит два четверных с различной текстурой, как это: enter image description here

Четырехъядерный слева имеет белую текстуру шашки, а квадрат справа имеет красный цвет.

Вот код, который отображает текстуры на два каре:

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glBindTexture(GL_TEXTURE_2D, texName[0]); 
    glBegin(GL_QUADS); 
    glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0); 
    glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0); 
    glEnd(); 
    glBindTexture(GL_TEXTURE_2D, texName[1]); 
    glBegin(GL_QUADS); 
    glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421); 
    glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421); 
    glEnd(); 
    glFlush(); 
} 

Мы можем видеть, что даже если код использует GL_QUADS рисует один четверной в каждом штате GL_QUADS. Однако, если я закомментировать glEnd() и glBegin (GL_QUADS) в середине этого кода, как это:

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glBindTexture(GL_TEXTURE_2D, texName[0]); 
    glBegin(GL_QUADS); 
    glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0); 
    glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0); 
    // glEnd(); 
    glBindTexture(GL_TEXTURE_2D, texName[1]); 
    // glBegin(GL_QUADS); 
    glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421); 
    glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421); 
    glEnd(); 
    glFlush(); 
} 

Оказывается, второй glBindTexture (GL_TEXTURE_2D, texName 1) больше не работает. И результат:

enter image description here

Может кто-нибудь сказать мне, почему я не могу поставить два glBindTexture в одно GL_QUADS состояние?

ответ

5

Потому что OpenGL не поддерживает это.

только вызовы, которые вы можете сделать для OpenGL в то время как внутри glBegin/glEnd являются представления вершин вызовы, такие как glTexCoord*, glVertex* и т.д. Все остальное является ошибкой.

Что касается «почему», одна из причин «потому что спецификация говорит так». Скорее всего, GPU обрабатывает весь набор данных (или значительных фрагментов) параллельно, в течение которого он не может переключать текстуры.

Также рассмотрим новый способ рисования с помощью OpenGL: загрузка ваших данных в объект буфера вершин и вызов одной из команд glDraw*. Вы не можете даже позвонить glBindTexture между примитивами, используя это.