이것은 7 년 전에 C ++로 작성하려고 노력했던 오래된 OpenGL 기반 게임 엔진에서 가져온 것입니다. OpenGL 렌더러 클래스 (OGLRender) 내에서 다음 네 가지 기본 메소드를 사용했습니다.
- 3D 월드 씬을 렌더링하기 위해 OpenGL을 준비하기위한 ready3D () .
- 2D GUI를 렌더링하기 위해 OpenGL을 준비하기위한 ready2D () .
- render3D ()실제 3D 월드 장면 그리기를위한 .
실제 2D GUI 드로잉의 render2D ()
void OGLRender::ready3D()
{
glViewport(0, 0, m_Setup.width, m_Setup.height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, (float) m_Setup.width / m_Setup.height, 0.1, 5000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
}
void OGLRender::ready2D()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, m_Setup.width, m_Setup.height, 0.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.375, 0.375, 0.0);
glDisable(GL_DEPTH_TEST);
}
void OGLRender::render3D()
{
this->ready3D();
// ... draw 3D world scene here ...
}
void OGLRender::render2D()
{
this->ready2D();
// ... draw GUI here ...
}
그런 다음 기본 스레드 루프에서 기본적으로 다음 순서로 메소드를 호출합니다.
while(m_drawFrame)
{
gm_Render->render3D(); // draw 3D scene
gm_Render->render2D(); // draw GUI
SDL_GL_SwapBuffers(); // make drawn frame visible
}
그래서 제가하고있는 일은 3D 월드 씬을 먼저 그리고 GUI가 항상 월드 씬 위에있는 방식으로 GUI를 마지막에 그리는 것입니다. ready3D () 메소드는 월드 씬 드로잉 및 ready2D ()에 대한 3D 월드 투영을 준비합니다. 메소드는 GUI 드로잉을위한 2D 직교 씬을 준비합니다. m_Setup.width
그리고 m_Setup.height
바로보기 포트 화면 크기입니다.
ready2D () 메소드 의 특별한 점은gluOrtho2D()
함수가 GUI 프리미티브를 그릴 때 Windows, Mac 및 기타 데스크탑 화면 좌표 시스템과 일치하도록 지정된 화면 좌표로 그릴 때이를 알려주는 인수와 함께 호출된다는 것입니다. 왼쪽 상단은 (X, Y) 형식에서 (0,0)이고 오른쪽 하단은 (ViewportWidth-1, ViewportHeight-1)
입니다. 그리고 glTranslatef()
픽셀 당 정확한 위치를 수정하기 위해 사용된다. 따라서 (0,0)에서 (0,9)까지 선을 그릴 때 실제로 선은 왼쪽 상단부터 10 픽셀 (길이 및 1 픽셀 너비)까지 그려집니다.
전반적으로 ready2D () 메소드 의 기능에 관심 이 있습니다. 다른 방법의 소스 코드 예제를 제공하여 일반적으로 대부분의 게임이 3D 월드 장면 및 GUI 드로잉 순서를 수행하는 방법에 대한 아이디어를 제공합니다.
([0...1], [0...1], 0, 1)
투영, 뷰 또는 월드 매트릭스 가없는 좌표를 사용 하면 항상 화면 공간에 도달합니다.