프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by ozlael

지난 번 글에서 이어지는 글입니다.

이전 글 : PC에서 3D 입체 영상 게임 개발하기 #2


들어가며

그동안은 재미 없는 내용 읽어주시느라 수고 많으셨습니다. 이번 시간부터는 재미 없는 이야기 말고 본격적으로 PC 게임에 입체 영상을 적용 할 수 있는 방법을 알아보기로 하겠습니다. 아니 어쩌면 이번 시간부터가 더 재미없고 지루해질 수도 있겠네요. 하지만 별로 어려운 내용은 없으니 그냥 편안히 읽어주시면 감사하겠습니다.


미들웨어

그럼 과연 PC에서 입체 영상을 적용하려면 어떻게 해야할까요? 디스플레이 장치도 애너글리프, 셔텨그래스, 편광안경 등 많은 종류에 따라 직접 구현을 해줘야할까요? 셔터그래스 방식이면 좌안 우안 영상을 각각 직접 따로 만들어서 프레임에 맞게 번갈아가며 직접 출력해줘야할까요? 편광안경 방식이면 해상도에 맞춰서 도트를 좌안 우안 번갈아가며 직접 찍어줘야할까요? 애너글리프(적청안경) 방식이면 다행히 하드웨어를 타지 않아서 직접 만들어 출력 해 줄 수도 있습니다. 옛날에는 애너글리프를 직접 구현해서 발매된 게임들도 존재하구요.

이미지 출처 : wikipedia

하지만 서울-대전을 2시간이면 주파하고 그 안에서 스마트폰으로 RPG를 즐기는 현대에서도 저렇게 직접 노가다를 해 줘야 할까요? 당연히 아니지요. 그냥 우리는 그동안 개발하던대로 그냥 개발하면 되고 입체 영상 미들웨어의 지원을 받으면 됩니다. 미들웨어의 요구에 맞게 아주 약간(혹은 매우 많이;;) 신경써주기만 하면 자동으로 입체 영상이 탄생하게 되지요.

현재 PC용 입체 영상 미들웨어는 주로 nVIDIA의 3D VISION, iZ3D, Tridef의 DDD 이 세 가지가 쓰이고 있습니다. 다른 것도 더 있는 것 같이도 하고 잘은 모르겠지만 암튼 이 세 가지만 알고 계시면 될 것 같습니다. nVIDIA 3D VISION은 nVIDIA에서 만들었으므로 nVIDIA 그래픽 카드에서만 돌아가고, Windows VISTA 이상에서 작동합니다. 그와 달리 iZ3D와 DDD는 nVIDIA 뿐 아니라 ATi와 intel 모두 지원하며 Windows XP 이상에서 작동합니다. 그래서 ATi에서는 nVIDIA에 대항하기 위해 iZ3D와 DDD와 제휴를 맺기도 하지요. 그래서, Geforce 유저들은 3D VISION을 주로 이용하고, Radeon 혹은 GMA 유저들은 iZ3D 혹은 DDD를 주로 이용합니다. 이는 즉 모든 H/W를 지원하기 위해서는 이 세 미들웨어를 모두 신경써줘야 한다는 뜻이 되겠지요.

이 미들웨어들은 게임 뿐 아니라 영화 사진 등 다양한 입체 영상 컨텐츠를 지원하는데요,  사용자가 이 미들웨어 드라이버를 활성화 하고 컨텐츠를 실행 시키면 사용자가 가지고 있는 출력 장치에 맞게 출력이 되지요. 원래 입체영상을 보기위해서는 편광이나 셔터글래스 등 3D 지원 모니터와 특수 안경이 필요하지요. 하지만 이 미들웨어들은 특수 장비가 필요 없는 적청영상도 제공을 합니다.(한번 설치하셔서 확인해보세요. 참고 링크 : http://ozlael.egloos.com/3570101) 사용자의 출력 장치가 편광(주로 LG 제품) 방식이든 셔터글래스(주로 삼성 제품) 방식이든 컨텐츠 제작자는 신경 쓸 필요가 없는 것이지요. 

유저가 입체 영상 미들웨어의 드라이버를 활성화 하고 게임을 실행하면 대부분의 게임은 자동으로 입체 영상으로 변환됩니다. 개발자가 따로 신경을 쓰지 않아도 기본적으로는 작동하도록 미들웨어가 만들어진 것이지요. 그럼 어떤 규칙에 의해서 입체 영상이 알아서 만들어 지는 것일까요? 이 규칙만 잘 따르면 큰 문제 없이 입체 영상을 지원 할 수 있겠지요?


드로우 콜과 랜더 타겟

우선 세 미들웨어 모두 기본적인 원리는 같습니다. 하나의 드로우콜(Draw call)을 미들웨어가 중간에서 좌안용 우안용 두개의 드로우콜로 나눠서 그리는 것이지요. 이를 스테레오화(stereolize) 된다고 표현합니다. 그래서 대부분의 게임들은 큰 문제 없이 그려질 수 있는 것이지요.

드로우콜은 최종적으로는 랜더타겟(Render target)에 그리게 되지요. 바꿔 말하자면 드로우콜이 좌우 두 개가 만들어지는 것 처럼 랜더 타겟도 두 개가 만들어 지게 되는 것입니다. 드로우 콜과 마찬가지로 하나의 랜더 타겟 생성 명령이 날려지면 미들웨어는 중간에서 좌안용 우안용 두 개의 랜더 타겟을 생성합니다. 후에 드로우 콜이 날려졌을때 미들웨어는 그리는 대상이 좌우 두개가 만들어진 랜더 타겟이면 드로우 콜 역시 두 개로 나누고, 그렇지 않으면 하나의 드로우 콜만 날리게  됩니다.

네, "좌우 두개가 만들어진 랜더 타겟이면" 드로우 콜이 나눈다고 하였습니다. 그 말인 즉슨 무조건 랜더 타겟이 두개가 되는 것이 아니라는 말입니다. 두 개로 나누어 지지 않은 랜더 타겟에 그리면 입체로 만들어지는 것이 아니라는 뜻이지요. 그렇다면 랜더타겟이 두 개로 나누어 지는 조건은 무엇일까요? 이는 미들웨어마다 조금씩 차이점이 있습니다.

nVIDIA 3D VISION은 크기가 백버퍼 이상이고 비율이 비(非)정사각형인 랜더타겟을 생성 시 두 개로 만들어집니다. 일반적으로 대부분 백버퍼는 4:3 혹은 wide로 만들기 때문에 정사각형이 아닌 조건을 충족하고, 백버퍼 이상이라는 조건 때문에 MSAA시에도 정상적으로 입체영상이 만들어 지는 것입니다. 이 조건 덕에 일반적인 셰도우맵(shadow map) 방식의 그림자도 이상 없이 작동하는 조건이 충족이 됩니다. 셰도우맵은 광원에서 바라보는 시야의 모습이기때문에 스테레오가 아닌 모노가 되어야 합니다. 즉, 좌우 갈라져야 하는 케메라 시야에서의 모습과는 달리 하나만 존재하는 태양 광원의 시야이기 때문에 좌우 갈라지면 안되는 버퍼인것이지요. 보통 셰도우맵 버퍼는 정사각형으로 만들고 사이즈는 256이나 512등 백버퍼보다 작은 사이즈로 만들기 때문에 좌우 갈라지지 않고 하나의 버퍼로만 존재하게 되는 것입니다.

이미지 출처 : nVIDIA

TriDef DDD는 크기에 대한 제약 조건은 없지만 정사각형이 아닌 랜더타겟만 좌우 분리가 되기때문에 위와 같이 셰도우맵에 대한 정상적인 대응이 가능합니다. 하지만 iZ3D는 이러한 조건은 존재하지 않고 랜더타겟은 무조건 좌우 두개로 만들어냅니다. 모노 랜더타겟을 원한다면 오로지 API를 통해서만이 가능합니다.


.마치며

개발자가 딱히 신경쓰지 않아도 되는 알흠다운 상황에 대해 알아봤습니다. 다음 시간부터는 조금씩 신경 써 줘야 하는 사항에 대해 다루기 시작하겠습니다. 이제 조금씩 귀챦아질 수 있으므로 다음 시간까지 안녕히계세요 ㅋ 


 

댓글을 달아 주세요

  1. Favicon of https://toymaker.tistory.com 바하무트 2012.06.26 10:12 신고  댓글주소  수정/삭제  댓글쓰기

    다음 시간 재밌겠어요! >ㅂ<
    3D~3D~~ 하면 일루젼...