문제

다음과 같이 간단한 쿼드를 그려고 싶다고 가정 해 봅시다.

glBegin(GL_QUADS);
glVertex2f(-1.0,-1.0);
glVertex2f(1.0,-1.0);
glVertex2f(1.0, 1.0);
glVertex2f(-1.0, 1.0);
glEnd();

모든 3D 객체 뒤에 나타나서 전체 화면을 채우도록 이것을 그릴 수있는 방법이 있습니까? 내 카메라는 마우스와 함께 움직이기 때문에이 쿼드는 카메라 움직임으로 고정되어 있어야합니다. 목적은 간단한 배경을 만드는 것입니다.

눈 위치/회전을 기반으로 미친 변형을해야합니까, 아니면 glmatrixmode ()를 사용하여 더 간단한 방법이 있습니까?

도움이 되었습니까?

해결책

그것은 당신이하고 싶은 것이 간단한 게임에서 2D HUD를 그릴 때 또는 지속적인 배경과 비슷한 것 같습니다. 나는 전문가가 아니지만 비교적 최근에 그렇게했습니다. 당신이하고 싶은 것은 프로젝션 매트릭스를 직교 프로젝션으로 변경하고 쿼드를 렌더링 한 다음 이전에 있던 투영으로 다시 전환하는 것입니다. 매트릭스 스택 으로이 작업을 수행 할 수 있으며 모든 카메라와 완전히 독립적입니다.

먼저 :

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
int w = glutGet(GLUT_WINDOW_WIDTH);
int h = glutGet(GLUT_WINDOW_HEIGHT);
gluOrtho2D(0, w, h, 0);

이로 인해 새로운 프로젝션 매트릭스가 프로젝션 스택으로 밀려납니다 (이 프로젝트에 GLUT를 사용하고 있었지만 정상적인 OpenGL로 변환해야합니다). 그런 다음 창 너비와 높이를 얻고 gluortho2d를 사용하여 직교 투영을 설정합니다.

다음:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// Draw your quad here in screen coordinates

여기서는 모델 뷰에 새롭고 깨끗한 매트릭스를 밀어 넣습니다. 이 작업을 수행 할 필요가 없습니다.

마지막으로 :

glPopMatrix() // Pops the matrix that we used to draw the quad
glMatrixMode(GL_PROJECTION);
glPopMatrix(); // Pops our orthographic projection matrix, which restores the old one
glMatrixMode(GL_MODELVIEW); // Puts us back into GL_MODELVIEW since this is probably what you want

이게 도움이 되길 바란다. 알 수 있듯이 눈 위치를 사용하지 않아도됩니다. 이것은 주로 창에 완벽하게 맞는 새로운 직교 투영을 사용할 때 관련이 없기 때문입니다. 그러나 다른 드로우 호출 후에 실행되면 쿼드를 뒷면에 넣지 않을 수 있습니다.

편집 : 깊이 테스트를 끄고 깊이 버퍼를 지우는 것도 도움이 될 수 있습니다.

다른 팁

각 프레임에 대해 내가 사용하는 단계는 다음과 같습니다.

  1. 깊이 버퍼를 사용하십시오 glClear(GL_DEPTH_BUFFER_BIT);
  2. 깊이 테스트를 끄십시오 glDisable(GL_DEPTH_TEST);
  3. 고정 직교 투영에로드 gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
  4. 설명한대로 쿼드를 그립니다.
  5. 깊이 테스트를 다시 켜십시오.
  6. 정기적 인 관점 예측을로드하고 나머지보기를 그립니다.

배경에 배치 할 수 없습니다. 주변에 원하는 경우 자신을 상자에 넣으십시오. 모든 개체 뒤에 그것을 만들려면 먼저 그려야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top