OpenGL을 사용하여 HUD / GUI 만들기 (LWJGL)


15

저는 게임 개발 단계에서 HUD 또는 GUI를 만들어야합니다. 나는이 부분에 가본 적이 없으므로 어떻게했는지 모르겠습니다. 화면의 고정 위치에서 간단한 쿼드를 렌더링하려고 시도했지만 문제가 있습니다. 카메라를 직교와 함께 사용하려면 다음을 사용하십시오.

public void lookThrough()
{
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(position.x, position.x + Display.getDisplayMode().getWidth()/zoom, position.y + Display.getDisplayMode().getHeight()/zoom, position.y, -1, 1);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
}

이 방법을 사용하여 어떻게 화면에 무언가를 고정시킬 수 있는지 알 수 없습니까? 이 주위에 어떤 방법이 있습니까? 감사 :)


이것은 Direct3D 관점이기 때문에 대답하지는 않지만 ([0...1], [0...1], 0, 1)투영, 뷰 또는 월드 매트릭스 가없는 좌표를 사용 하면 항상 화면 공간에 도달합니다.
Jonathan Dickinson

답변:


13

이것은 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 드로잉 순서를 수행하는 방법에 대한 아이디어를 제공합니다.


고마워, 나는 직교와 관점 사이의 전환이 성능에 나쁜지를 알지 못했습니다. 왜냐하면 그것은 큰 작업처럼 보입니다 (물론 OpenGL의 작동 방식을 거의 알지 못합니다 ... 여전히 배우고 있습니다!) 보았고 당신이 말한 것을 이것을 제안하십시오. 그래서 내가 할 것 같아요 :)
smoth190

나는 이것이 내가 생각하고있는 것에 대한 대답을 좋아한다. 각 2D 렌더에서 프로젝션 매트릭스를 밀고 나면 더 잘 할 수 있는지 궁금합니다. 그것은 당신이 한 번 확실하게 3D를 설정할 수 있다는 것을 의미합니까? 그런 다음 처리 할 경우 창 크기 변경을 위해 3D 설정을 다시 호출하기 만하면됩니다.
전구 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.