2011-08-28 2 views
1
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

//set viewpoint 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(VIEW_ANGLE,Screen_Ratio,NEAR_CLIP,FAR_CLIP); 
gluLookAt(0,5,5, 0,0,0, 0,1,0); 

//transform model 1 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glRotatef(Theta, 0,1,0); 

//draw model 1 
glBegin(GL_QUADS); 
... 
glEnd(); 

위의 코드는 정상적으로 작동하지만 gluPerspective에 대한 호출을 제거 할 수있는 방법이 있습니까?gluPerspective를 한 번만 사용하는 방법은 무엇입니까?

나는 각각의 렌더링 동안 반복적으로 반복하는 것이 아니라 초기화 할 때 한 번만 호출하려고합니다. 당신이 glLoadIdentity() 호출하지 않는 경우

+0

코드에서 gluPerspective를 호출하지 않아도 렌더링이 예기치 않은 결과가 발생합니다. – jondinham

+0

왜 이렇게 피하려고 너무 열렬합니까? – Flexo

답변

5

당신은이 gluPerspective를 호출합니다. OpenGL은 사물을 초기화하는 장면 그래프가 아닙니다. 상태 기반의 드로잉 API입니다. 프로젝션 매트릭스는 상태이며 모든 심각한 그래픽 응용 프로그램은 단일 프레임 렌더링을 통해이 상태를 여러 번 변경합니다.

OpenGL은 기하학적 객체, 위치 및 카메라를 알지 못합니다. 처리 파이프 라인을 통해 점, 선 및 삼각형을 푸시하고 결과를 화면에 그립니다. 무언가가 그려진 후에, OpenGL은 그것을 전혀 기억하지 못합니다.

초기화시 한 번만 호출하는 것을 의미합니다.

OpenGL은 렌더링 컨텍스트 생성을 제외하고는 초기화되지 않지만 실제로는 OpenGL이 아닌 운영 체제의 그래픽 스택에 포함됩니다. 물론 텍스처를 업로드하고 객체 데이터를 버퍼링 할 수는 있지만 언제든지 발생할 수 있습니다. 그것은 일반적으로는 뷰를 구성하는 가장 왼쪽 변환 (glLoadIdentity 펼쳐진)로서, 카메라/뷰를 정의하며, 따라서, 모델 뷰 매트릭스에 속한다

1

모든 프레임 (단위 행렬을로 현재 행렬을 재설정, 즉 gluPerspective()가 무슨 짓을했는지 실행 취소) 대신 조심스럽게 push/pop 당신은 초기화에서 호출 멀리 얻을 수있는 행렬을 변환 꽤 행복하게. 일반적으로 시작 도면을로드 할 때마다로드 ID를 호출 한 다음 재설정하는 것이 훨씬 쉽습니다. 예컨대 :

// Initalisation 
glLoadIdentity(); 
gluPerspective(...); 

그런 다음 나중에이 : 거기 속해 있기 때문에

// Drawing each frame 
glClear(...); 

glPushMatrix(); 
gluLookAt(...); 

//draw stuff 

glPopMatrix(); 
+0

glPushMatrix 및 glPopMatrix를 사용하면 성능이 크게 향상됩니까? 모든 객체를 루트로 이동하는 것과 비교하십시오 (glLoadIdentity를 호출하는 경우). – jondinham

+0

프레임 당 한 번 발생하는 작업의 성능에 집착하지 않겠습니다. 단지 가치가 없습니다. 기하학, 쉐이더 및 텍스처와 같은 모든 것들에 대해 걱정할 필요가 있습니다. 'glLoadIdentity()'+'gluPerspective()'와'glPushMatrix()'+'glPopMatrix()'의 비용을 측정하는 것에 비해 사실상 불가능합니다. – Flexo

4

, 투영 행렬 하지 사용 gluLookAt를 수행 단어 modelview의 일부. 그것은 또한 당신의 방식으로 작동하지만 개념적으로 잘못되었습니다. 이렇게하면 모든 프레임의 투영 매트릭스를 만질 필요가 없으므로 문제가 해결됩니다.

실제로 datenwolf의 접근 방식은 OpenGL의 상태 시스템 아키텍처에 대해 개념 상 더 깨끗합니다.