본문 바로가기

Programming/Architecture

Architecture my OpenGL engine core2

지난 설계에 이어 디스플레이에 대한 설계와 설명을 진행 할게요.

포스팅 하기에 앞서, 확인 해 보고 싶은 몇 가지가 있었어요. 일단, 현재 만들었던 프로젝트는 확장성을 거의 염두 안하고 만든 대다가 오브젝트를 그리는 방법 자체도 전혀 원시적인 방법을 사용해서 테스트하는데 시간이 좀 걸렸네요^^;;;

빛이 오브젝트에 어떻게 영향을 받는지에 대해서 진행한 테스트 였는데, 왜 이런 테스트를 진행 했는지는 포스팅을 보면 이해가 가실 테구요.
  1. 단일 광원, 다수 오브젝트

    다수라고 해봐야 두 개에요ㅋㅋ. 일단, 이 테스트는 굉장히 간단해요. 단일 광원이 오브젝트에 쐬였을 때 어떻게 보여질까~? 이고, 결과는 아래와 같아요.


    다시 한번 말하지만, 지금 정점과 법선 벡터등의 설정이 전혀 되있지 않은 상태에서 테스트를 위해서 급조한 거라 '출력물이 이상한대?' 할 수 있어요. 감안해서 보시기 부탁 드릴게요 :)

  2. 다수 광원, 다수 오브젝트

    이 부분은 몇 가지 조건이 있어요. 조건에 따라 분류하면 아래와 같아요.
    • 다수 광원이 둘 다 켜져 있을 때

      일단, 너무나 밝은 빛 두개가 들어오니까 확 밝아 졌네요.
      빛에 대한 포스팅은 여기서 참고 하세요

      참고를 하셨다면 아래의 결과가 나오는 부분을 이해 하시겠죠~

    • 각각의 광원이 각각의 오브젝트에만 영향을 미칠 때

      광원0은 오브젝트0을 비추고,
      광원1은 오브젝트1을 비추는 상황이에요.

      각각의 서로의 빛에 영향을 전-혀 받지 않아 주었으면 하는 바램이었죠.
      결과는 아래와 같이 나온답니다.

    • 하나의 오브젝트에만 광원이 영향을 미칠 때

      원래 좌측 오브젝트는 초록색, 우측 오브젝트는 빨강색 이였어요.(원래는 빛에 대해서 이 부분이 명확하게 들어나야 하는데, 아직 정리가 안되서ㅜㅋ)

      좌측 오브젝트가 광원0에 영향을 받고, 우측 오브젝트가 하나의 빛에서도 영향을 받지 않으면 아래와 같은 결과가 나와요.



위의 테스트는 단순히 "뭐, 저런식으로 작동하는 구나" 하고 넘어가시면 될 거 같아요;D
  • 디스플레이 설계
    • 필요한 클래스 정리(기능 분할)

      디스플레이는 화면 그 자체를 의미 해요. 신나게 렌더링한 결과물을 출력 하는 거죠. 단순히 "출력한다"라는 의미에서 보다 그러한 화면 하나하나의 단위인 Frame이 있지만, 영화에서 사용하는 단위인 Scene이라는 이름으로 사용 할거에요 :)

      프로그래밍은 다른건 모르겠지만 이름 지어주는 건 참 중요한 거 같아요:D


      그럼 씬(Scene)하나를 만드는 기능이 필요 하겠죠? 그리고 디스플레이 클래스는 그것을 상속받아서 사용 하구요.


      하나의 씬에는 다양한 오브젝트들이 포함 되어 있어요. 아래는 그에 대한 예시를 그려 넣은 거에요. 제가 지금 참고 하고 있는 서적에서는 이러한 부분을 거의 묵살하다시피 나와있는데 범용적으로 사용 할 수 있도록 머리를 조금 쥐어짜 보았어요.

      일단 임시로 만들어본 화면 구성에 대해서 보여드릴께요.


    • 필요한 클래스 정리(Layer)

      일반적으로 왠만한 게임들이 많이 사용 하게 되는 화면 구성이죠. UI가 있고, 메뉴들에 대한 내용이 있으며, 팝업 UI도 있고, 실제 게임을 플레이 하는 세계(World)도 있구요.

      이것들을 화면 하나가 모두 관리를 하는 그 자체도 어렵겠지만, 출력 내용을 바꾼다던지 구성이 달라지는 등 변경 사항에 대해서 매번 다시 수정해야 하는 거는 "빡" 칠 거 같죠?@_@ㅋ
      그려지는 파트별로 구별을 시켜주는 게 필요 할거 같더라구요. 그 부분을 레이어(Layer)라고 하고 구성하려고 해요. 바로 아래와 같은 형태로 구성하면 특정 부분에 대해서 수정 할 때 그 부분만 신경 쓰면 되는 거죠.


      물론 각 레이어를 어떻게 구성 할 거인가는 구현자 마음이죠.

      이렇듯 Layer라는 것은 DISPLAY를 잘게 조각 낸 작은 DISPLAY들의 집합으로 볼 수 있어요. 그리고 이러한 여러 개의 Layer를 통합 관리하는 것은 DISPLAY가 할 역할 이구요. 물론, 작은 DISPLAY라고 함은, Scene을 갱신할 수 있어야 겠죠? 그렇다면 설계는 아래처럼 이루어 져요.


    • 필요한 클래스 정리(Layout)

      실제 게임 플레이를 하게 되는 세계(World)의 경우에는 거의 하드코딩으로 이루어 지기 때문에 어쩔 수 없다 손 치지만, UI의 경우에는 구지 해당 부분을 만든 프로그래머가 아니어도 수정을 할 수 있는 게 좋겠죠?(모 게임의 경우 사용자가 직접 자신의 입맛에 맞춘 UI를 구성 할 수도 있잖아요~) 어느정도의 규칙성은 필요 하겠지만, 일단 그 첫 단계가 레이어를 다시 잘게 조각 내는 거에요.
      그 조각들은 Layout이라고 이름 짓고 잘게 쪼개 볼게요.


      물론, Layout 이라는 것들이 가지고 있어야 하는 부분에 어떠한 내용들이 들어가야 하는지는 사전에 약속을 해 놔야 겠죠. 그리고 그런 규칙을 배포해서 이런 형식으로 만들어 주세요~ 하면 그걸로 끝!


      위의 부분까지 설계를 한다면 아래와 같을 거에요.


      잠시 큰 덩어리로 다시 올라가 볼게요.

      DISPLAY의 경우에는 뿌려지는 화면의 크기가 곧 윈도우의 크기가 되요.
      Layer의 경우에는 DISPLAY의 크기를 따라가게 되죠.
      하지만, Layout의 경우는 약간 달라요. Layer의 영역 내부에 포함이 되어 있어야 하죠. 그리고 몇 개씩 배치해도 상관 없고, 각 영역이 무엇을 뿌리는지도 달라요.

      그럼 뿌린 다는 것은 그것을 보고 있는 것이 있었야 하는데, "본다"는 역할을 하는 클래스가 있죠. 바로 카메라(CAMERA)! 각 Layout이 보고 있는 카메라는 한 개씩 존재해요. 하지만 한 개 이상 있을 수도 있어요. FPS게임에서는 플레이어가 죽으면, 다른 플레이어의 시야를 볼 수도 있잖아요? 이때에는 실제 동작하는(Active) 카메라가 무엇인지 필요 하겠죠.

      그래서 Layout은 카메라를 별도로 관리 해야 해요.


      Active Camera를 관리하는 건, 포인터도 좋고 인덱스도 좋아요. 그건 취향에 맞춰서 구현 하시기 바랄게요 :D

    • 화면 갱신(UpdateScene) 흐름

      그럼 실제로 화면 갱신이 일어나면 전체적으로 어떻게 흘러가는지 설계된 것은 다음과 같을 거에요.


      DISPLAY는 모든 Layer를 UpdateScene 한다.
      Layer는 모든 Layout을 UpdateScene 한다.
      Layout은 자신의 ActiveCamera로 먼저 View를 지정 하고(See 함수)
      Layout은 모든 OBJECT를 렌더링 한다.

      이렇게 한번 돌아가는 것이 하나의 Scene, 그래픽 용어로 frame, 이 되는 거죠. 이게 쉬지 않고 돌아가는 것이 우리가 부드러운 게임을 볼 수 있는 거구요.

'Programming > Architecture' 카테고리의 다른 글

Architecture my OpenGL engine core3  (0) 2012.08.12
Architecture my OpenGL engine core1  (0) 2012.08.07
06 Collaboration Diagram  (0) 2012.07.21
05 Sequence Diagram  (2) 2012.07.14
04 Statechart Diagram  (2) 2012.07.10