yuchi's Development Home


4DyuchiGX #7 HeightField

조회 수 6399 추천 수 156 2002.09.01 01:51:29
오랫만이다..
이 글을 읽으시는 당신..기다렸는가? 고마움에 눈물이 앞을 가린다..
그동안 절라 정신없었다.매일매일 헉헉대며 산다는게 이런것인지...생각해보면 이 일을 시작한 이래 여유를 가져본적이 없다.
어쨌든...

2차 PT까지만 해도 나는 하이트필드를 따로 만들지 않을 생각이었다.매쉬로 밀어붙이는 편이 속도 면에서나 작업 능률면에서나 훨씬 낫다고 생각했다.흠..근데 2차 PT때 매쉬로 하이트필드를 쪼개서 모델링하는것은 거의 불가능하다는 불만이 터져나왔다.그래..그럴수도 있지...
허나..
난 내 맘대로 한다.
하이트필드는 여전히 만들 생각이 없었다.그러던 어느날 하이트필드용으로 만든 2km*2km정도의 거대한 매쉬 덩어리에 라이트를 이쁘게 박아서 화면에 띄우려고 익스포트를 했다.그리고 툴에서 읽어들이는데.....버버버버버벅...
한참 버벅거리더니..
억세스 바이얼레이션과 함께 크래쉬 해버렸다.이게 어찌된 일인가...
메모리 할당에 실패했다.왜 실패했을까? 1.5기가를 요구했는데 힙으로는 그만큼 할당을 해주지 못했다.1.5메가도 아니고 1.5기가? 정신을 차리고 계산을 해보니...그 거대한 매쉬 덩어리에 입힐 라이트맵을 위해서는 패치(폴리곤들을 16*16이나 8*8등의 텍셀단위로 작게 나눈 조각)메모리만 1.5기가가 필요했던 것이다.
패치 사이즈를 약간 줄이면 1기가 정도만 필요하게 할수 있을지도 모르지만,이건 말 다한거다.
바로 하이트필드를 만들기로 했다.

하이트필드란 무엇인가...굴곡있는 광대역 지형을 상대적으로 적은 리소스를 이용하여 뽀대나게 구현해주기 위한 방법이다.별거 아니다.그냥 높이 정보만 갖고 있다가 여러가지방법(?)을 통하여 3D매쉬로 구성하여 화면에 보여주는것이다.말은 쉬운데 여기엔 몇가지 문제가 있다.

첫번째로 부딪치는 문제는 텍스쳐 사이즈의 한계다.쉽게 생각할 수 있는 방법으로 하이트필드 한개를 통짜로 구성하고 대략 2km*2km정도를 구현했다고 치자.어색하지 않게 보이려면 10cm에 텍셀 하나 정도는 보장받아야 한다.그럼 1m*1m지형을 구현하는데 10*10짜리 텍스쳐,10m*10m에 100*100짜리 텍스쳐, 100m*100m에 1000*1000짜리 텍스쳐, 1km*1km에 10000*10000짜리 텍스쳐, 2km*2km면 2만*2만픽셀짜리 텍스쳐가 필요하다.(참고로 대부분의 최신 비됴카드의 텍스쳐 사이즈 한계는 2048*2048정도다.)

문제는 또 있다.그런대로 괜찮은 지형을 보여주려면 1m에 버텍스 한개씩은 깔아야되는데 2km*2km정도면 가로세로 2001*2001개의 버텍스가 필요하다.버텍스 갯수는 4004001개고 면 갯수는 2000*2000*2 = 8000000개다. 지형에만 8백만 폴리곤을 실시간으로 렌더링은 못하므로 어떻게든 더 작은 블럭들로 쪼개야한다.

3월경부터 하이트필드에 달라붙어서 최근(7월말)까지도 하이트필드를 고치고고치고 다시 만들고 생쇼를 했는데 결과적으로 어떤식으로 구현했는지는 기술적인 기밀사항이므로 밝힐순 없고..실패한 과정들만 적어보자.

처음 택한 방법은 하이트필드를 구성하되 일정 그리드로 잘랐다.가로세로100m*100m라거나..뭐 등등 그런 단위로 만든 블럭들을 옥트리클리퍼에 같이 넣어서 클리핑했다.일단 매쉬 자체의 LOD(Level of Detail)은 고려하지 않았다.텍스쳐 디테일만 신경썼다.텍스쳐는 조립을 하기로 했다.카메라의 eye포지션이 위치한 블럭을 중심으로 9개의 블럭을 잡아서 그 총 크기만큼의 텍스쳐를 새로 조립해서 만들었다.(D3D의CopyRect등으로) 나머지는 블럭들은 매우 Low detail의 텍스쳐를 한장씩 가지고 있게했다.기본적으로 툴에서는 타일로 찍고 타일이 찍힌 상태로 그대로 샘플링해서 디테일을 떨어뜨려 저장한것이다.
카메라 포지션을 중심으로 한 9개 블럭은 타일을 실시간 조합해서 텍스쳐를 새로 구성하게 했다.
결과적으로....
속도는 그럭저럭이었는데 텍스쳐를 조립하는 순간 끊김이 약간 있었고 융통성이 매우 부족했으며 (카메라가 높이 떠 있는 경우등) 항상 보여주는것에 비해선 리소스를 더 먹고 있었다.
두달쯤 쓰다가 포기하고 새로 만들었다.이 엔진 만들면서 가장 삽질한 케이스다.

두번째는 인덱스 버퍼를 이용해서 매쉬 자체는 LOD가 가능하도록 했다.여기까진 좋았다.속도는 만족스러웠고 융통성도 있었으며 리소스도 매우 적게 먹었다.근데..텍스쳐가 역시 문제였다.
이번엔 통맵에 디테일 텍스쳐를 쓰기로 했다.디테일 텍스쳐가 궁금하신 분들은 3D게임 프로그래밍 책을 참고하시라..설명하기 귀찮다.디테일 텍스쳐 자체는 꽤 훌륭한 꽁수였다.근데 통맵이 문제였다.하이트필드 블럭별로 짤라서 통맵을 씌웠는데 그때 테스트하던 2,56km*2.56km의 맵에서 하이트필드는 1600개나 되는 조각으로 잘려있었고 텍스쳐도 1600개를 생성해야했다.그것도 사이즈가 256*256 이상되는 텍스쳐를 말이다.당연히 잘 될거라 생각했지만 이 방식을 버리고 새로 만들때까지 블루스크린을 하루에도 몇번씩 봐야했다.D3D의 텍스쳐 리소스 관리에 문제가 있다는 사실을 알게 되었고 실험을 통해서도 1000개 이상의 텍스쳐를 동시에 사용하는것은 심각한 문제를 일으킨다는 것을 확인했다.

그래서 다시 타일로 돌아왔다.뭔가 쌈빡한 그런 방법이 없나 무진장 고민했다....없을까.그런 방법이..시바..시바...시바...

사실 하이트필드를 구현하기 이전에 나는 그림자를 먼저 구현했다.프로젝티브 쉐도우라거나 쉐도우맵이라 불리는 방식을 사용했다.간단히 말하면 그림자 텍스쳐를 만들고 그걸 그림자를 받을 객체에 투영시키는 것이었다.정석대로 하자면 그림자를 받을 객체의 모든 면에다가 한번씩 그려줘야하지만 그렇게 안하고 한방에 투영시킬 방법이 있었다.곧 텍스쳐 좌표를 이용하는것인데 텍스쳐를 미리 계산해두고 넣는게 아니고 계산식을 행렬로 만들어서 세팅하면 가속기의 지원을 받아 빠르고 저렴하게(uv좌표를 따로 넣을 필요가 없으므로 버텍스메모리를 아낄수있다) 텍스쳐를 만빵..투영할수 있는것이다.
이 얘길 왜 했냐면..난 이 방법을 하이트필드에 적용하므로서 텍스쳐 문제를 해결할 수 있었다.솔직히 지금 내가 봐도 웃음이 나올만큼 맘에 든다.
내가 왜 그 생각을 진작에 못했을까? 무식하게 텍스를 조립(copy)하지 않고서도 하이퀄리티의 텍스쳐를 좍좍 깔아줄수 있는데 말이다.뭐 진작에 생각을 못했던건 그림자 처리할때까지 텍스쳐 좌표를 리얼타임으로 생성해낼수 있다는 사실을몰랐기 때문이다.(아는게 힘이다.)

해서 하이트필드는 만족스럽게(물론 구질구질한 잔손질이 나중에 꽤나 들어갔지만) 구현을 했고 다음 작업으로 넘어갈수 있었다.그게 불과 두달전 일이다.
다음엔 다이나믹 라이트와 쉐도우에 대한 얘길 해보자.










댓글 '5'

베지타

2002.09.01 19:13:11
*.192.167.157

흠..정말로 많이 기둘린 보람이....TT

" 여치와 야망을 가진 사나이들 " 책 출간에 대한 희망이...-> (글타고 제가 모출판사와 모종의 관계가 있다고 자신있게 말할수 있는 상태는 아님~~^^ )

흠...요즘 본인두 쓰리뒤 프로젝트를 앞두고 쓰리뒤 공부에 한참 열을 올리고 있습니다...맨처음엔 쓰리뒤를 늦게 시작했다는것이 경쟁력을 이미 상실한

플머라고 생각했지만 정작중요한것은 쓰리뒤, 네트웍, etc...이런 장르??? 가 아니고 기본적인 것들( C/C++내공의 깊이, 시스템적인 기초지식등..) 이

얼마나 충실하느야에 따라 장르상 차이는 시간과 노력이 해결을 해주는 것이라 느껴지더군여... 뭐 이런생각들 가지게 된데는 영천님 조언이 늘 컸음을

인정합니다...게임프로그래머를 별로 안좋아하신다 했져...흠...저두 플밍자체가 좋은것 뿐이지 게임프로그래밍은 별루...하지만 다른장르??와는달리

비주얼적인 것이 특히 강조되는 게임플밍이 (나중이라도 나이먹어서 ) 다른 장르를 이해하거나 적응해야할 필요성이 생겼을떄는 그 기본바탕을 철저

하게 도와주는것 같습니다만....

흠..올만에 영천님 글보니 반갑고 여러스샷들을 보면서 영천님이 얼마나 고생하고 계신줄 알겠네여....

가을입니다....추남???의 계절이라는데..영천님과 어울리는지는 몰겠습니다만...ㅋㅋㅋ *^^*

늘 건강조심하시구..." 여치와 야망을 가진 사나이들 이책이 출간되는 그날까지...많은 이야기들 써주시기 바랍니다...

구럼 또 뵙져...



여치

2002.09.01 22:05:36
*.207.64.37

감사합니다. 사실 요새들어 자신감도 바닥이고 제 자신이 한없이 무능하게 느껴지기도 하는데 창규님 같은 분들이 응원해주셔서 힘이 됩니다.
앞으론 컬럼과 강좌등도 써볼 생각입니다.그럴 정신적 여유가 있길 바랄뿐이죠.아울러 저한테 조금 더 힘을 줄 아가씨도 생겼으면 좋겠군요.

빗자루

2003.12.16 17:43:56
*.49.114.194

>_<)b 이것도 멋지 생각.. 흑흑ㅠㅁㅠ)~ 링크해서 두고두고 봐야지

^____^

2008.03.20 02:33:57
*.29.249.44

역시..

어떤 결과에는 엄청난 댓가가 따르는군요...

글 올라온 날짜를 보니... OTL...

여치

2008.06.09 03:09:23
*.152.197.16

오래 되었죠. 이런 오래된 글에 리플 달아주시는 분이 계시다니 놀랍습니다. 옛날 글 보다가 우연히 발견했네요.
파일 첨부

여기에 파일을 끌어 놓거나 파일 첨부 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
天安門大屠殺 六四天安門事件 反右派鬥爭 大躍進政策 文化大革命 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution 人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 民主 言論 思想 反共 反革命 抗議 運動 騷亂 暴亂 騷擾 擾亂 抗暴 平反 維權 示威游行 法輪功 Falun Dafa 李洪志 法輪大法 大法弟子 強制斷種 強制堕胎 民族淨化 人體實驗 胡耀邦 趙紫陽 魏京生 王丹 還政於民 和平演變 激流中國 北京之春 大紀元時報 九評論共産黨 獨裁 專制 壓制 統一 監視 鎮壓 迫害 侵略 掠奪 破壞 拷問 屠殺 肅清 活摘器官 障テ社會 誘拐 買賣人口 遊進 走私 毒品 賣淫 春畫 賭博 六合彩 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China 西藏 土伯特 唐古特 Tibet 達償ワ喇嘛 Dalai Lama 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region free tibet



XE Login

天安門大屠殺 六四天安門事件 反右派鬥爭 大躍進政策 文化大革命 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution 人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 民主 言論 思想 反共 反革命 抗議 運動 騷亂 暴亂 騷擾 擾亂 抗暴 平反 維權 示威游行 法輪功 Falun Dafa 李洪志 法輪大法 大法弟子 強制斷種 強制堕胎 民族淨化 人體實驗 胡耀邦 趙紫陽 魏京生 王丹 還政於民 和平演變 激流中國 北京之春 大紀元時報 九評論共産黨 獨裁 專制 壓制 統一 監視 鎮壓 迫害 侵略 掠奪 破壞 拷問 屠殺 肅清 活摘器官 障テ社會 誘拐 買賣人口 遊進 走私 毒品 賣淫 春畫 賭博 六合彩 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China 西藏 土伯特 唐古特 Tibet 達償ワ喇嘛 Dalai Lama 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region free tibet