2014-09-04 2 views
0

간단히 말해 왜 두 개의 glBindTexture를 하나의 glBegin (GL_QUADS) ... glEnd()에 넣을 수 없습니까? 왼쪽에 enter image description hereGL_QUADS 상태가 다중 glBindTexture를 지원하지 않습니까?

쿼드 : 나는 OpenGL을 빨간 책의 9 장을 다음입니다

예 9-5에서 http://www.glprogramming.com/red/chapter09.html

는 프로그램 texbind.c이 같은 다른 텍스처와 두 개의 쿼드을 생산 흰색 체커 보드 텍스처가 있고 오른쪽 쿼드는 빨간색입니다.

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)를 주석 경우 : 그것은 두 번째 glBindTexture (GL_TEXTURE_2D, texName 1)을 밝혀

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 상태로 두 glBindTexture를 넣을 수없는 이유

enter image description here

사람이 말해 주시겠습니까?

답변

5

OpenGL은이를 지원하지 않기 때문에.

는 단지 당신이 내 glBegin/glEnd이 다른 건 오류 등등 glTexCoord*, glVertex*처럼 정점 제출 호출 동안의 OpenGL을 만들 수 있습니다 호출합니다.

"이유"에 대한 한 가지 이유는 "사양에서 그렇게 말했기 때문에"입니다. GPU는 전체 데이터 세트 (또는 그 상당 부분)를 병렬로 처리하는 반면, 텍스처를 전환 할 수는 없습니다.

또한 OpenGL을 사용하여 데이터를 버텍스 버퍼 객체에 업로드하고 glDraw* 명령 중 하나를 호출하는 최신 방법을 생각해보십시오. 이를 사용하는 프리미티브간에 glBindTexture을 호출 할 수있는 방법은 없습니다.

관련 문제