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

안녕하세요  Silverchime 이라고 합니다 실버차임입니다 치매가 아닙니다 ;ㅅ;
현재 T사의 TG프로젝트에서 배경쪽과 TA로 일하고 있습니다. 쟁쟁하신분과 차마 비교할 수는 없는데다, 평소에 항상 왜? 또는 어떻게? 등의 의문이 많은 아티스트일 뿐입니다.  이쪽저쪽 뛰어다니며 항상 신기한 것을 찾아다니고 그저 뭔가 모르던것을 알았을때 기쁘고 즐겁습니다. 혹시나 이런것을 좋아하실 분들이 있을것 같아 글을 써 보려고 합니다. 부디 ㅠㅠ 많은 지적 부탁드립니다. 막 떨리네요. 

사과가 빨갛게 보이는 이유는? 이란 질문 많이 들어보셨겠지요. 이제 지겹다고요 ? ㅠㅠ 
그래도 만에 하나 모르시는 분을 의해서 짤막하게 짚고 넘어가겠습니다. 

뜬금없는데다 또? 질문 외우겠다...


빛이 물체에 부딪힌 후 산란되어 G와 B 값은 표면에서 흡수하고 Red 값만 반사되어 우리 눈에 들어오기 때문입니다. 이를 디퓨즈 반사라고 합니다.
 

Diffuse reflection

 
스페큘러 리플렉션은 빛의 방향과 같은 앵글로 반사되는 빛입니다. 이걸로 사진상의 빛을 역추적할 수도 있고. 물체의 표면이 빛에 반사하는 성질을 알 수 있지요. 

Specular reflection



우리가 게임그래픽스에서 쓰는 많은 맵이있죠. 노멀맵, 스페큘러맵, 디퓨즈맵, 셀프일루미네이션맵, 이미시브맵, 알파맵... 

네 오늘은 이중에서 콕 찍어 물체의 스페큘러 리플렉션에 대해서만 이야기해보려고 합니다.
디퓨즈칼라는 위에서 간략하게 설명했습니다. 그렇다면 스페큘러 칼라는 어떤식으로 정해질까요? 

 거친느낌, 매트한느낌, 나무에 니스를 칠한 느낌, 메탈릭한 느낌... 플라스틱.. 등, 사실 촉각등의 부가적인 감각을 이용할 수 있다면 더더욱 정확한 물체의 정보를 알아내겠지만, 아쉽게도 실제로 모니터 속이나 입체안경속의 영상을 만져볼수는 없으니, 경국 게임 그래픽스의 물체의 표면, 즉 매트리얼의 질감을 전해주는 거의 유일무이한 정보는 바로 이 반사되는 빛의 정도와 그 색상에 의한 시각정보입니다. 스페큘러맵은 그만큼 중요한 정보를 전달하고 있지요.

 재미있는 점은 사람들이 궃이 반응하도록 교육을 받거나 의식하지 않아도 표면에 반사하는 빛의 양과 색 등의 정보에 따라 물체의 표면 정보를 시각적으로 인지한다는 점인데요. 

 다음 사진을 보시겠습니다. 메탈릭과 일반 글로시한 표면에 대한 사진을 모아 보았습니다. 경험적으로 어느쪽이 메탈릭인지 보이시지요?
 


이러한 메탈릭 칼라와 나무나 플라스틱등 유기물(탄소체)의 질감의 차이는 어떤곳에서 나오는 것일까요? 

대체 이유가 뭐냐 니들...
 
 
그 이유는 고유한 금속 물체 표면의 전자 때문입니다. 

금속 물체의 표면을 확대한 개념도 입니다. 
원자 주변에 shared electron(공유 전자)이 퍼져 있습니다. 
이 전자는 원자 주변을 자유롭게 이동합니다. 

빛이 이러한 물체의 표면에 부딪치게 되면
(레이저가 빛, 차량이  금속표면이라고 하겠습니다. 무리수 크리티컬...) 
courtesy : Halo

이때 빛에너지에 의해 표면의 에너지레벨이 상승하며 (전자가 들뜬 상태)
이 낮은 에너지레벨과 상승한 레벨 사이의 파장이 특정 가시광선대를 흡수합니다.  


이것을 Band Theory (에너지저레벨과 고레벨의 차이를 밴드라 합니다) 라고 하며 
이러한 이유 때문에 금속 표면들은 고유한 반사율과 메탈 고유의 색을 가지게 됩니다.  


이러한 일렉트론을 가진 도체 물체 표면을
전도체 Conductors 라고 부릅니다.

 그러면 반대의 경우,  일반 글로시한 물질의 표면은 어떨까요? 
네 일반 유기체, 사과나 플라스틱이나, 대리석이나, 니스칠한 나무같은 것들이죠. 이들의 표면에는 당연히 자유롭게 돌아다니는 일렉트론이 없고, 따라서 빛이 히트하더라도 밴드 이펙트가 발생하지 않으므로 표면의 색의 차이는 단지 하얀색으로 명도(Brightness) 의 차이만 발생하게 됩니다. 
 
이런경우를 절연체 Dielectrics 이라고 합니다.  

자 그럼 이런 각기 다른 경우들의 스페큘러를 다시한번 보겠습니다. 

좌측이 전도체, 오른쪽이 절연체 입니다. 이제 표면이 어떤 차이인지 구분이 확 가시지요? 

주변의 실제 물체를 보시면 사진보다 구분이 더 잘 가실 겁니다.  


   일반 절연체 Dielectric의 경우에 있어 일반적으로 흡수하는 빛의 색과 반사되는 빛의 색은 서로 보색관계에 있습니다. 한번 직접 실연을 해보도록 하겠습니다. 

포토샵에서 1. Diffuse맵의 칼라를 한장 더 복사해서 Saturation/Hue 패널을 열고 끝까지 돌려 보색으로 만들고 2. 반짝일 부분을 마스크로 그려서 3. Linear Dodge형태로 원래의 diffuse의 색에 블렌딩하면 정확한 스페큘러 칼라가 나옵니다.

  

그럼 이제는 컨덕터 표면의 스페큘러 칼라를 블렌딩 하는 법을 알아보겠습니다. 
이 경우는  그저 디퓨즈 컬러를 그냥 사용하거나 아니면 약간 밝게 Brighten된 이미지를  Linear dodge(add)연산을 해주면 됩니다. 

만일, 그러면 만일 보색으로 변환해주고 add 해주는 위의 일반적인 dielectric 방식으로 해주면 어떤식으로 보일까요? 두가지를 한번 비교해보도록 하겠습니다. 
 

자 위쪽의 이미지를 보시면 하얀색으로 반짝이는 구리방패를 보실 수 있습니다. 아래쪽이 정상적인 스페큘러 칼라를 그냥 얹은 형태입니다. 레퍼런스와 비교해 보시면 어떤식으로 다른지 보이실겁니다. 위쪽은 하얗게 올라오지요. 아래가 정상입니다. 
 

위의 형식으로 한번 이번은 문짝에 일반적인 메탈릭 스페큘러식으로 그냥 약간 밝게 한 블렌딩과 보색처리를 해준 두 세트를 비교해 보았습니다. 레퍼런스와 비교해 보시면 위쪽이 정상적인 블렌딩입니다. 아래는 나름 할로겐 조명 같다고 우기시면 ㅠㅠ Orz


메탈릭이냐 아니냐, 이런 이론을 모르는 사람도 대부분 경험적으로는 알고 계실거라고 생각합니다. 하지만 저는 부끄러운 고백을 하겠습니다. 모를때는 그냥 디퓨즈맵을 대충 얼버무려서 쓰고는 했습니다. 그런데, 항상 대체 메탈릭 칼라란 무엇이고 어째서 다르게 느껴질까? 라는 의문은 머리속에서 떠나지를 않더군요. 

사실 우리 주위의 대부분이 빠른 산화를 막기 위해서든 차가운 느낌이 싫어서, 또는 추울때 닿으면 살이 얼어서 들러붙는다던지 등, 여러 가지 이유로 금속표면을 그대로 노출하는 경우는 드뭅니다. 하지만 배경이나 장식에서는 금속 장식이나 오나먼트등 순수한 금속 자체로 노출되는 경우가 많습니다 더불어 시각적으로 잘 보이는곳에 배치하므로 빛에 강하게 노출되고는 합니다. (특히나 배경에는 자주 씁니다..노출된 메탈...황동Brass, 구리Copper, 금박Gold... )

 courtesy : Warhammer 40,000 ; Space Marine 
푸른색은 약간 매트한 페인트 도색, 숄더패드 장식과 백팩 커버는 금색 메탈로 보입니다.
 
게임에서는 퍼포먼스를 위해 스페큘러맵을 Glossiness 마스킹 맵으로 쓰는 경우도 많고 이런 경우는 대신 매트리얼에서 오버레이 되는 스페큘러 칼라를 설정해서 쓰곤 합니다. 이럴 경우 어떠한 칼라가 필요한지, 또는 유광 페인트로 으로 커버된 표면인지, 아니면 여러가지 Transition metal을 사용한 칼라가 들어가 있는 금속 표면인지를 결정하는 하나의 기준이 될 수 있다고 봅니다. 위에서도 말했지만, 게임 내에서는 단지 시각적 정보로만 물체의 표면을 표현하고 판단해야 되니까요. 

일례로, Transition metal인 Iridium을 섞으면 블루칼라의 골드도 나올 수 있습니다. 
아니면, 어떤 게임에서 자전거가 중요한 비주얼을 차지하는 게임인데 
아노다이징 도색을 적용했을때 라던지의 경우가 있을 수 있겠죠. 

나 좀 비싼 프레임.... Anodized color
간지를_표현해_주지_않으면_유료프레임_템을_사지_않을테다.jpg


이상으로 물체의 스페큘러 칼라에 대해 알아보았습니다. 
정리하면 절연체와 전도체의 경우 다른 스페큘러 칼라를 가진다는것, 그리고 왜 절연체의 경우 스페큘러 칼라가 하얀색으로 표현되는지, 전도체의 경우는 왜 특이한 색을 띠는지에 정도가 되겠네요... 헥헥

부족한 글을 읽어주셔서 감사합니다. 다음은 배경에서 쓰일 인간의 행태학 Behavior 라던지, 환경, 기후, 건축등 여러가지 다른 주제로 찾아뵙도록 하겠습니다. 모두 즐거운 하루 되세요 ^^ 

반응형
,
Posted by 대마왕J

1. 들어가며
우선, 인사부터 드리겠습니다. 대마왕J 입니다.
3일과 18일이라는 영광스러운 자리에 배정해 주셔서 감사합니다 포프 스승님.

일명 '대충 살아가는 게임개발자' 라고 불리기도 하지요. 원래 그래픽 디자이너 출신이었고, 게임쪽으로는 20년이 조금 안되는 경력을 가지고 있습니다. (쓸 데 없이 길기만 하군요)

지금 하고 있는 일은 N문 사에서 그래픽이지만 프로그래밍이기도 한... 테크니컬 아트 디렉터(Technical Art Director) 를 맡고 있고 그 중에서도 shader/Lighting 쪽을 맡아서 일하고 있습니다. 저는 hlsl 언어로 직접 쉐이더를 짜고 있지요.

이 팀블로그에 계신 포프님이나 하이브리드님, 오즈라엘님이나 티스님 같은 다른 모든 분들에 비해서는 턱없이 부족한 실력이라 이거 뭘 쓸 게 있나... 싶었긴 했습니다만,

다른 분들과는 다르게 그래픽 디자이너로 시작한데다가 기초도 없이 맨땅에 해딩하면서 배워왔던 지식이라, 다른 분들보다는 그래픽 디자이너 입장을 쉽게 알 수 있다고 생각해서 ' 엄청나게 무식하고 쉽게' 라는 모토로 기초적인 shader 실습 / 이론을 진행해 볼까 생각해 보았습니다.

마치 '만화로 쉽게 배우는 푸리에 해석' 같은 느낌일까요 -_-; 뭐, 만화는 나오지 않습니다만...

무려 성안당..

2. 대상
일단 대상은 ' 프로그래밍을 하나도 모르는 그래픽 디자이너' 를 대상으로 합니다.
그래서, 이론은 나올지언정 코딩은 전혀 하지 않으면서 쉐이더를 배우게 됩니다.

게임 제작이라는게 워낙 복합적이고 다양한 사람들이 모여 만들어야 하는 융합학문 계열인지라, 서로의 영역을 조금씩 침범할 수 밖에 없는 직종입니다.

그래서인지 이게 그래픽인지 , 프로그램인지, 기획인지 헷갈리는 영역이 존재하기도 하고, 두 개 이상의 분야가 제대로 이해하고 협력해야 결과가 나와야 하는 영역도 있습니다. 그 중에 shader 영역은 그래픽 디자이너의 영역이기도 하면서, 그래픽 프로그래머의 영역이기도 합니다. 그래픽 디자이너는 자신이 원하는 '느낌' 을 감각적으로 표현할 수 있고, 프로그래머는 어떤 결과가 나오는 '과정' 을 논리적으로 풀어갈 줄 아니까 말이지요.

그러므로 프로그래머가 '감각' 을 익히거나, 그래픽 디자이너가 '과정' 을 이해하거나 한다면, 훨씬 좋은 결과물이 나올 수 밖에 없는 것이 바로 이 shader 라고 할 수 있습니다.

프로그래머를 위한 기초 shader 강의는 포프님이 해 주시니까, 저는 그래픽 디자이너 (혹은 기획자, 혹은 진짜 개념만 잡고 싶은 프로그래머) 를 위한 기초 shader 강의라고 할 수 있겠지요.

3. Shader가 뭔가요?

가장 중요한 질문을 넘어갈 뻔 했군요.
포프 스승님이 강의에서 말씀하시길, 쉐이더란

"쉐이더란 화면에 출력할 픽셀의 위치와 색상을 계산하는 함수입니다. "

라고 하셨습니다.
음... 감이 오시는지? 저는 이걸 그래픽 디자이너 마인드로 다시 설명해 보겠습니다.

"쉐이더는 '재질' 입니다. 일명 '때깔' 이라고도 하지요."

... 이것이 그래픽 디자이너가 이해하는 쉐이더입니다.

스승님이랑 싸우자는게 아니고, 위의 두 가지 표현이 포프님의 강의와 제 강의의 차이라고 할 수 있겠습니다. 포프님의 강의가 '교과서' 라면, 저는 '그림동화' 입니다 ㅎㅎ

당연하게도 내용은 재미위주고, 깊이는 훨씬 얄팍합니다.

자 여기 그림들이 있습니다.
http://izismile.com/2010/06/30/how_games_change_the_rock_21_pics.html

'게임에서 돌이 어떻게 바뀌나' 라는 재미있는 그림인데, 다소 과장이 섞여 있는 말그대로 재미를 위한 글입니다. 그렇지만, 의외로 쉐이더란 무엇인가라는 대답을 주고 있기도 합니다.

자, 이 중 몇 개만 비교해 보죠.






차이가 보이시는지? 같은 돌임에도 불구하고, 게임마다 뭔가 다르게 느껴지고 있다는 것을 알 수 있습니다. 사실 이 결과물은 단순히 색을 조작해서 게임의 분위기를 풍자하고 있는 글이지만, 조금만 생각해 보면 진짜로 게임마다 저런 '뭔가 독특한 질감' 을 가지고 있었다는 것을 아실 수 있습니다.

또 아래 그림을 보시죠.

File:Toon-shader.jpg

http://upload.wikimedia.org/wikipedia/commons/b/b7/Toon-shader.jpg

같은 모델링인데, 분명히 '질감' 이 다릅니다. '때깔' 이 다르지요. [각주:1]

4. 그래픽 디자이너가 shader 를 배워서 어디에 쓸 수 있나요?

요즘엔 shader를 사용 안하는 프로젝트가 전무하다고 할 정도로 게임 그래픽에서 매우 중요한 한 축을 담당하고 있습니다. 그래서 싫다고 해도 어쩔 수 없이 그래픽 디자이너가 shader의 많은 옵션들을 조절하기도 해야 하고, 마스킹 텍스쳐도 적절하게 제작해야만 하며, 필요하다면 원하는 느낌을 내기 위해서 그래픽 프로그래머에게 '어떠어떠한 느낌으로 만들어줘' 라고 요구해야만 하지요. (저희 회사에선 제가 맘대로 합니다만 ㅎㅎ)
이럴때 이론적 지식은 큰 도움이 되게 됩니다. 아무래도 프로그래머가 만든 언어라 그래픽 디자이너와는 용어도 다르고, 원하는 느낌을 최고로 내면서 효율적으로 만들기 위해서 필요한 기술을 그래픽 디자이너가 익히려면 기본적인 지식 정도는 가지고 있어 주어야 하거든요.

그리고 프로그래머에게 이런 기술적 지식 없이 그래픽 디자이너의 언어로
"뽀샤시하지만 착 눌러앉은 색감으로 너무 딴딴하지 않은 질감이 나도록 만들어줘"
라고 요구한다면 프로그래머에게서는 이런 반응이 나오게 됩니다


프로그래머의 반응

또한 최근에는 언리얼처럼 노드 구조를 직접 그래픽 디자이너가 조합할 수 있도록 만드는 쉐이더 툴을 지원하는 엔진도 꽤 생겨나고 있는 편인데다가, 최신 3Dmax 에서는 아예 메터리얼 에니터를 이런 노드 구조로 만들기도 하였습니다.

즉, 좋은 그래픽을 위해 꼭 사용할 줄 알아야 하는 메터리얼 에디터가 될 것이라는 거지요.
 
5. 뭘 준비해야 하나요?
원래 이 분야는 프로그램적 마인드로 제대로 접근하자면, 렌더링 파이프라인부터 시작해야 정상입니다. 그치만, 그래픽 디자이너의 마인드는 프로그래머의 마인드와 한참이나 다른 데 부터 시작합니다.

기본적으로 그래픽 디자이너는 비싼 타블렛이나 마우스에 목숨걸고, 프로그래머는 비싼 키보드에 목숨걸잖아요. 인터페이스 조작부터 그래픽 디자이너들은 다르게 접근해야 합니다.

생각해 보세요. 그래픽 디자이너는 첨에 '뭣도 모르고 무작정 이쁘게 그리려다 보니까' 결국엔 더 이쁘게 그리기 위해 빛을 생각하게 되고, 선 그리는 법과 구도, 투시를 익히게 되지요.

그림에 관심도 없는 사람이 그림이론부터 차근차근 배우기 시작해서 나중에 보니까 그림을 잘 그리게 되었더라... 라는 케이스는 거의 없습니다.

멋진 프로그래머가 되기 위해서 그 지루한 기초 프로그래밍을 차근차근 밟아 가야 뭔가 기초적인 결과라도 볼 수 있는 프로그래머와는 달리, 그래픽 디자이너는 처음부터 연필을 잡고 아무생각 없이 휙휙 그려봤더니 뭔가 이쁘더라 ... 에서부터 시작하곤 하거든요.

이 아저씨 강의 때 선 긋기부터 안나오잖아요. TV쇼라서 더 그렇겠지만.

여기서부터 프로그래머 마인드랑 정반대로 가는 거지요. 프로그래밍 책이 그래픽 디자이너에게 어려운 이유는 그것입니다.

'아놔 첨부터 좀 멋진 거 하게 해 달라고! 버퍼는 뭐고 시멘틱은 또 뭐야!!! 안해!!! '

이게 그래픽 디자이너 마인드지요 :)

그래서 , 복잡한 기본 이론 따위는 나중으로 미뤄 버리려 합니다.
가능한한 첨부터 그림이 나오게 합니다!
바로 제가 수없이 삽질하면서 공부했던 그 방법입니다!

그리고 중간중간 필요한 이론만 간략하게 설명하겠습니다. [각주:2]
그러다보니, 필요한게 있습니다. 3D max 입니다.

3D max 는 다소 간략하긴 하지만, 인터페이스가 꽤 괜찮은 실시간 렌더링 툴이기도 합니다. 즉 게임과 다를게 없지요. 3D max 만으로도 초급 shader는 배울 수 있습니다. 무엇보다 그래픽 디자이너들을 위해, 마우스로 대부분의 조작을 할 수 있다는 것과 익숙하다는 장점도 매우 큽니다.

3D max 실력은 높을 필요는 없습니다만, 기본적인 오브젝트 정도는 설치할 수 있는 실력이어야 합니다. (보통, 주전자 정도 만들고 텍스쳐 하나 입힐 수 있는 수준이면 충분해요)

여기에 하나 더, 쉐이더를 다루기 위해서 무료 플러그인이 필요합니다.
앞서 말씀드렸듯, '바로 처음부터 재미있는 실습을 하기 위해' 무언가 설치해야 합니다.

바로 Shader FX 라고 하는 플러그인이지요.

http://www.lumonix.net/shaderfx.html

다운로드는 위 홈페이지에서 받을 수 있습니다. 완전 무료입니다.
 
그리고 시간이 되시는 분은 이 사이트의 강좌 동영상을 훑어 보시면, 사실 제 강의가 필요 없을 정도로 쉽게 이 프로그램을 다루실 수 있습니다. 영어라서 문제지

이 프로그램을 설치해 두세요. 설치시의 유일한 주의사항은, 중간에 맥스의 버전을 잘 선택하시고, 설치 경로를 정할 때 반드시 3Dmax가 설치된 Root 폴더를 선택해 주셔야 한다는 겁니다.


맥스가 설치된 폴더를 정확히 지정해 주어야 합니다

자신의 Max 버전과 맞는 것을 선택하세요[각주:3]

이제 3Dmax를 실행시켜 봅니다. 튜터리얼 동영상 링크가 가득한 첫 화면이 뜨지요.
첫 화면에 이렇게 되면 완성입니다.

 



만약 이렇게 안나온다면 잘못 설치한 겁니다.[각주:4]


동영상만 봐도 사용법은 충분히 알 수 있습니다만, 문제는 이 동영상에서도 얘기해주지 않는 것입니다. 그래픽디자이너에게는 생소한 용어와 개념들 말이지요.
그러므로 다음 시간부터는 이 기초적인 용어와 개념을 그래픽 디자이너가 이해할 수 있도록 설명하면서 shaderFX를 이용하여 shader를 다뤄 보도록 하겠습니다.

  1. 사실 요즘 쉐이더의 영역은 이것보다 조금 더 넓게 응용되곤 합니다. 없던 폴리곤을 만들어 낼 수 있고, vertex shader를 조작해서 폴리곤을 이동할 수도 있습니다. 하지만 기본적으로는 이렇게 '질감 을 변화 시키는 기능' 이라고, 다소 지엽적으로 알고 있어도 그래픽 디자이너 수준에서 한동안 큰 문제는 없다고 볼 수 있습니다. [본문으로]
  2. 솔직히, 아무리 간략하게 해도 길어질 내용이 꽤 있습니다만, 그것도 할 수 있는 한 재미 위주로 만들 생각입니다 [본문으로]
  3. 프로그래머들은 잘 이해 못하겠지만, 그래픽 디자이너는자신의 프로그램이 32bit 인지 64bit 인지도 잘 모르는 경우가 많습니다. [본문으로]
  4. 만약 이렇게 나온다면, 주변에 있는 프로그래머에게 설치를 도와달라 부탁하세요. 그러면 '내가 컴퓨터 AS 기사냐!' 라고 화를 내는 프로그래머를 보실 수 있게 되실 겁니다. ㅎㅎ분명 프로그래머는 설치 기사가 아니지만, 논리적이고 차분하고 똑똑하기 때문에... 참 잘 해 주긴 합니다. 게다가 여자 그래픽 디자이너가 부탁하면 더 잘 해주는 편입니다. (... 농담입니다. 아무래도 어그로 끌 것 같아) [본문으로]
반응형
,
Posted by 알 수 없는 사용자
제가 오늘 포스팅할 내용은 '해킹' 입니다!
옛날엔 해킹이 굉장히 먼나라 이야기처럼 들렸지만 요즘은 정말 해킹이 난무하는 시대가 온 것 같습니다.


게임도 역시 이 해킹의 대상에서 벗어날 수 없습니다.
특히나 P2P를 이용한 온라인 게임들은 해킹에 취약하며, 해킹에 의한 피해가 다른 게임에 비해 굉장히 큽니다. 저도 역시 몇년전 P2P를 이용한 게임의 유지보수를 하면서 해킹에 굉장히 많이 시달린 경험이 있습니다. 게임프로그래머가 게임만 만들면 되지 해킹에 대해서 알 필요가 있냐?! 라고 물으실 분들이 계실수도 있습니다. 하지만 저는 게임을 만들고 게임을 서비스하는 모든것들이 게임개발자로서 신경써야 하는 부분들이라고 생각합니다. 게임 해킹은 게임 서비스를 괴롭히는 요소중 하나이기 때문에 게임프로그래머도 기본적인것은 알아야 하지 않나 생각됩니다.

사설이 조금 길었는데요.. 
아무튼 오늘 설명할 내용은 '울트라에디트'와 '기본적인 센스'만으로 해킹이 가능한 게임에 대해서 입니다.

이게 무슨 김밥천국에서 아메리카노 파는 소리처럼 들릴지도 모르겠습니다만..
해킹 보안에 대해 아무런 신경을 쓰지 않고 만든 게임은 해커도 아닌 그냥 일반 사용자가 
울트라에디트만으로 해킹이 가능한 게임을 만들어버릴지도 모릅니다.

일단 무작정 울트라에디트로 해킹을 한번 해봅시다!


위 샘플을 받으면 실행파일이 하나 있을 것입니다.
이것을 실행시키면 F1을 누르면 "TestFucntion1" F2를 누르면 "TestFunction2" 메시지가 나오는 아주 간단한 프로그램입니다. 발로 만든 샘플이죠..



이 프로그램을 울트라에디트에서 열어봅시다.
저는 울트라에디트가 없어서 무료 헥사 에디터를 하나 받았습니다..



실행파일의 구조에 대해 공부하신적이 없다면 조금 머리가 아플 것입니다. 일단 눈앞에 보이는건 무시하고 Ctrl+F를 눌러서 검색을 해봅시다. TestFunction으로 검색을 해보도록 합시다.



이렇게 검색을 하면 아마 다음과 같은 코드가 검색이 될 것입니다.


TestFunction1@TestClass@@어쩌고 저쩌고 하는게 있고 그 아래에 TestFunction2@TestClass@@블라블라..
여기서 TestFunction1을 TestFunction2로 수정을 해보도록 하겠습니다.



그리고 저장을 한 후에 실행파일을 다시 실행시키고 F1을 누르면..
이번엔 TestFunction1이 아닌 TestFunction2 라는 메시지가 나올 것입니다.



정말 울트라에디트 하나만으로 정말 간단하게 프로그램 수정이 되버린것입니다.

전문적인 지식이 없어도 이렇게 헥사에디터로 프로그램파일을 열어서 "HP" 또는 "MP" 같은 키워드를 검색하여 간단하게 수정을 시도하는 유저들이 존재하며, 그렇게 수정을 해서 실제로 비정상적인 동작을 하는 게임도 존재합니다.

그렇다면 방금 헥사에디터를 이용해서 수정한 것은 어떤것이 어떻게 수정된 것일까요?

보통 저렇게 문자열을 검색 해서 나오는것은 코드내에서 문자열을 사용했기 때문이라고 생각할 수 있습니다. 하지만 방금 수정된 부분은 코드 내에서 직접적으로 문자열을 사용한 부분이 아닙니다.

이 실행파일의 코드를 잠시 살펴보면 Sample.exe가 있고 SampleDll.dll이 있습니다.
Sample.exe가 SampleDll.dll을 사용하고 있고, SampleDll에 TestClass와 TestFunction1,2가 들어있습니다.


 


이렇게 암시적로딩으로 dll을 사용하는 경우 '__declspec(dllexport)'와 '__declspec(dllimport)'같은 키워드를 사용하게 됩니다. export를 한 함수는 dll의 .edata 영역에 정보가 저장이 되고, import를 한 함수는 사용하는 exe또는 dll의 .idata 영역에 정보가 저장이 됩니다.


 
 그 중에서 위에서 수정한 부분은 Sample.exe의 .idata 영역에 있는 INT(Import Name Table)라는 녀석입니다. 정확하게는 INT의 요소가 가리키고 있는 IMAGE_IMPORT_BY_NAME 구조체의 내용을 수정한 것입니다.

그렇다면 도대체 INT라는 녀석이 뭐길래 이런 정보를 저장하고 있는걸까요?
암시적 로딩을 이용한 dll 로딩을 할 때의 과정을 보면 INT가 하는 역활을 알 수 있습니다.
자세하게 설명하기엔 너무 복잡하고 머리 아프니까 간략하게 설명하도록 하겠습니다.

로딩할 DLL의 이름 가져오기 -> DLL 로딩 -> 임포트 섹션에서 임포트할 함수들의 정보 가져오기 -> 익스포트 섹션에서 함수들의 주소 가져오기 -> 임포트 섹션의 IAT(Import Address Table)에 함수들의 주소 저장하기

이 과정이 끝나게 되면 DLL에 있는 함수는 IAT를 통해 호출할 수 있습니다. 
따라서 울트라에디트같은 헥사에디터를 통해 INT를 수정하고 프로그램을 실행시키게 되면, 
DLL이 로딩될 때 원래 호출해야 할 함수가 아닌 다른 함수의 주소를 가져와서 IAT에 저장하기 때문에 다른 함수가 호출되는 것입니다.

IMAGE_IMPORT_BY_NAME 구조체의 내용을 수정하는 것은 일반적으로 코드에 "" 키워드를 이용해 입력된 문자열 데이터보다 수정될 수 있다는것을 인식하기 어렵기 때문에 훨씬 위험합니다. 게다가 함수의 이름과 클래스의 이름이 노출되기 때문에 해커들에게 정보를 주는 역활을 하기도 합니다.

그런데 보통 게임을 만들때에는 역활별로 프로젝트 단위로 나눠서 작업을 많이 하게 됩니다.

그리고 이 모든 프로젝트들이 항상 정적라이브러리로만 쓰는건 아닐것입니다. 저희팀 같은 경우에는 상황에 따라서 정적라이브러리를 쓰기도 하고 동적라이브러리를 쓰기도 합니다.

아무튼 제가 말씀드리고자 하는것은 어쨌든 동적라이브러리로 만들고 익스포트된 내용들은 위에처럼 수정이 가능하거나 또는 정보를 제공하게 되므로 게임과 직접적인 연관이 있는 시스템, 컨텐츠 관련 내용들의 경우에는 정적라이브러리로 만드는것이 좋다는 것입니다.

그리고 어쩔 수 없이 동적라이브러리로 만들고 게임과 직접적인 연관이 있는 함수들을 노출해야 한다면, 실행파일의 변조체크 정도는 해주고 서비스를 해야 할 것입니다.

실행파일의 변조체크를 하는 가장 간단한 방법은 MD5같은 체크섬 알고리즘을 이용하여 실행파일과 dll의 내용로부터 체크섬값을 미리 얻어와서 서버에 저장해두고, 로그인시에 클라이언트가 실시간으로 체크섬값을 실행된 실행파일과 dll로부터 얻어온 후 서버로 보내고 서버에서 체크하는 방법입니다.

물론 해킹의 방법은 굉장히 다양하고 보안을 위해 이런저런 코드를 넣은것도 우회하는 방법이 굉장히 많습니다만.. 기본적인것들은 알아두자 하는 생각에 포스팅을 해 보았습니다.
반응형
,
Posted by 김포프
아시는 분들은 아시겠지만 제가 2011년 9월에 스페이스 마린이란 게임을 출시했습니다. 다음은 이 게임을 마무리하는 도중 느꼈던 점을 아주 간단히 길게 정리해 놓은 글입니다. 게임을 마무리 지을 때 가져야할 프로그래머의 마음가짐, 아주 당연한 거라고 생각해왔는데 모르는 분들도 좀 계시더군요.

게임 출시전에 가져야 할 마음가짐이란 간단히 말해 조홀라~ 조심하는 겁니다. 아무래도 코드를 수정 할 때마다 새로운 버그를 만들 확률이 높아지거든요. '뭐~ 버그 좀 만드는 거야 어떻다고... 나중에 고치면 되지~' 하시는 분들도 있을텐데요. 이런 마음가짐은 게임 마무리 단계에서는 먹히지 않습니다. 게임 출시 직전에 모든 것을 테스트할 시간이 굉장히 부족하거든요. 특히 몇 년 동안 제대로 작동하던 기능들을 전부 다 테스트할 수 있는 여력은 없지요.

저는 주로 Xbox 360 및 PS3용 콘솔 게임을 개발합니다. 콘솔게임이 시중에 나오려면 반드시 콘솔 제작자(마이크로소프트 및 소니)가 정해 놓은 기술 테스트를 통과해야 하죠. 이 테스트를 신청한 시기부터 그 결과를 들을 때까지 걸리는 기간이 대략 1달입니다. 근데 만약 부주의하게 만든 버그 때문에 이 테스트에 실패하면 어떻게 될까요? 뭐, 버그 고쳐서 다시 테스트 신청을 합니다. 또 1달 기다리죠. 여러 번 버그를 만들면 어쩌죠? 뭐, 출시일이 지연되겠죠. 마케팅 하시는 분들 이미 돈 다 퍼다 부었는데....... 근데 이게 전부일까요? 아뇨... 테스트를 신청할 때마다 돈도 내야합니다. 얼마냐고요? 별로 안비쌉니다.  한 번에 몇 천만원 정도... -_- 왠만한 프로그래머 연봉 한 번에 날라가는 건 쉽죠. 자, 이제 문제점을 아셨나요? 출시날짜를 놓쳐서 돈 날리고 테스트 신청 하느라 또 돈 몇 번 날립니다. 이래도 별 문제가 아니라고 생각하신다면 여러분이 만든 버그때문에 테스트 실패할 때마다 봉급에서 몇 천 만원씩 까면......이제, '뭐~ 어떻다고?'하고 생각하시는 분은 없겠죠? -_-


그럼 제가 이번에 느꼈던 경험을 바탕으로 게임출시 전에 반드시 해야할 일과 하면 안되는 짓거리(?)를 간단히 설명드리겠습니다.

  • 고장난 것만 고친다: 위에서도 말씀드렸듯이 코드를 수정할 때마다 새로운 버그가 생길 확률이 높아집니다. 게임 출시직전에 제대로 작동하고 있는 코드를 괜히 쓸데없이 만져서 프로젝트 전체를 망칠 위험을 감수하는 건 바보같은 짓입니다.
  • 타인의 코딩 스타일을 자기 기호에 맞게 바꾸지 않는다: 코드를 이리 저리 옮기는 것, 빈 칸 4개를 탭 하나로 바꾸는 것, 한 줄로 길게 쓰인 코드를 보기 좋게 여러 줄로 나누는 것 등... 뭐 다 좋은 일인데... 이런 짓을 하다가 버그를 만드시는 분들이 꽤 됩니다. 아무리 훌륭한 프로그래머도 인간인지라 실수는 하기 마련입니다. (본인을 절대 실수 안한다고 생각하시는 분들 계시나요? 당신은 무지할 뿐입니다... -_-) 각 프로그래머가 1달에 한 번만 실수해서 버그 만들어도 프로그래머 30명을 가진 팀에서는 하루에 하나씩 버그가 나옵니다. 남의 코딩 스타일, 이딴 게 맘에 걸리시더라도 그걸 굳이 게임 출시전에 고칠 필요는 없습니다. 그냥 노트에 적어놨다가 다음 게임을 만들 때 고치세요. 또 한가지 말씀 드리고 싶은 것은 개인적으로 정말 맘에 안드는 코딩 스타일이 있는데 사내 코드베이스에 그런 스타일이 만연해 있으면 그건 사내 프로그래머들이 동의한 코딩 스탠다드일 가능성이 높습니다. 이거 맘에 안든다고 자기 맘대로 바꾸기 전에 본인이 사회부적응자는 아닌지 한 번 진지하게 고민해주는 센스... ㅇㅇ?
  • 게이머(또는 테스터)를 만족시킬 수 있는 것만 고친다. 프로그래머의 자기만족은 무시한다: 수학적으로 옳지 않은 게 보인다고요? 최종 사용자(게이머)가 신경 쓸만한 것이이 아니면 고치지 마세요. 그 흔히 쓰는 포토샵의 레이어 블렌딩조차 수학적으론 틀리다는 거 아시나요? 하지만 포토샵을 사용하는 아티스트들은 별로 신경도 안쓰죠. 마찬가지로 게이머들도 수학공식에는 크게 신경 않씁니다. (오히려 수학공식 매우 싫어할껄요? -_-) 수학적으로 옳아보겠다고 프로그래머 맘대로 뭔가를 수정하면 이로 인해 피해를 보는건 동료 개발자들 뿐입니다. 다음과 같은 상황을 생각해 보죠. "아티스트 아찌들~ 울 게임에서 수학적으로 틀린 게 있었어요. 그래서 제가 이렇게 올바르게 고쳤거든요.. 무핫핫~ 그래서 최종 조명 결과가 좀 달라보일테니... 아트들을 다 고쳐주세요! 지난 2년 동안 만들어 왔던 아트들 다 고칠 시간 있죠?..... 뭐 마감이라서 없다구요?!? 하... 하지만 이게 수학적으로 맞는건데... 좀 해욧!" 이딴 식의 주장을 하는 본인을 발견하신다면... 우선 남들의 업무를 존중하는 법부터 배우세요. 본인 만족을 위해서 수학공식 파는 것도 좋고 제가 상관하고픈 바도 아닌데... 남들에게 불합리한 피해를 끼친다면 그냥 퇴사하고 절에 들어가서 홀로 게임 만드시라고 권해 드리겠습니다.
  • 그래도 반드시 고쳐야할 것이 있다면 그로 인해 조금이나마 영향을 받을만한 다른 개발자들 모두의 허락을 받는다: 본인이 고쳐야한다고 생각하는 것과 동료 개발자들이 고쳐야 한다고 생각하는 것에는 차이가 있을 수도 있습니다. 그들이 고쳐야한다고 생각하는 것이 더 중요할 수도 있지요. 만약 그렇다면 다른 개발자들의 업무부담을 늘리는 버그수정은 차라리 안하고 넘어가는게 납니다.
이 위에 적은 이야기들... 사실 게임을 하나라도 출시해 본 프로그래머라면 다들 알고 있을 법한 상식이라 생각했습니다. 특히 콘솔게임을 출시해봤다면. 그런데 스페이스 마린을 마무리 하는 도중 이런 믿음이 깨진 일이 있었죠. 자칭 경력많은 콘솔 게임 프로그래머라고 하는 작자가 하루가 멀다하고 무수한 버그를 만들어 냈고, 제가 그걸 디버깅할 특권(?)을 부여받았더라죠. 근데...... 이 모든 버그들이 발생한 이유가 바로 이 몰상식한 놈이 게임 출시전에 갖춰야할 마음가짐을 몰랐기 때문이라지요..... 써글... -_-

제발 프로그래머 아찌들 부탁인데... 게임을 출시할 때만큼은 좀 책임감있게 코딩합시다... 네?


포프였습니다.

반응형
,
Posted by 알 수 없는 사용자

안녕하세요. 알콜코더 민군입니다.

 

현대 게임 개발의 가장 기본적인 모토는 데이터 주도 개발(DDD. Data Driven Development)입니다.

바로 순수한 게임 클라이언트 자체는 일종의 게임 엔진과 같은 역할을 하면서, 외부의 데이터를 기반으로 게임을 제작하는 아키텍쳐입니다.

, C++로 제작된 게임 클라이언트는 게임의 핵심 요소만을 구성하면서,  외부에서 사용할 수 있는 API를 제공하고,  게임 코어 외부에서는 루아와 같은 스크립트로 게임 로직을 제작하고,  XML같은 데이터 파일로 게임의 요소등을 정의합니다.

이러한 방식을 가장 잘 활용한 것이 바로 WOW입니다. 와우의 경우에는 UI면에서 이러한 루아 스크립트와 XML을 유저들에게 제공하여, 유저들에게 맞는 다양한 커스터마이징 UI와 애드인들을 제작할 수 있게 되어 있습니다. 그리고 이러한 방법이 크게 성공하여, 수많은 유저들이 만든 다양하고 유용한 애드인 역시 상당히 많습니다.

그래서 와우 이후에도 수많은 게임들이 스크립트를  개발에 다양하게 활용하고 있고, 유니티나 언리얼 같은 게임 엔진은 스크립트만으로도 게임을 제작할 수 있는 형태입니다.

 하지만 제가 이야기 하려는 것은 이런 외부 사용자나 엔진 사용자를 위한 스크립트가 아니라,  실제 게임 개발 내부에서 사용되는 스크립트의 사용에 대해서 이야기를 하려고 합니다.

게임 개발에서 스크립트는 필수 불가결한 요소라는 의견도 많고, 저 역시 그런 의견들에 상당히 동의합니다. 그런데 과연 대한민국의 게임 개발에서 스크립트란게 정말로 유용할까요? 결론부터 이야기하면, 제 개발 경험에 비춰 보았을 때  저는 그렇지만은 않다고 생각합니다.

 

스크립트는 누가 작성하는가?

원래 스크립트의 용도는 앞서 이야기했듯이, 게임 코어에서 제공하는 API들을 가지고, 게임의 로직을 개발하는 용도입니다.

, 일반적으로 게임 코어는 프로그래머가 제작을 하고, 레벨 디자이너나 퀘스트 디자이너 같은 기획자들이 스크립트를 가지고 게임을 제작하는 형태입니다. 실제로 해외 게임의 포스트모텀들을 보면 이런 형태로 스크립트가 사용되어서 개발되고 있습니다.

그러면 과연 대한민국에서도 그럴까요? 아닙니다. 대한 민국의 대부분의 게임 회사에서는  루아 스크립트는 바로 프로그래머가 개발하고 코딩합니다! 전 이것이 가장 큰 문제라고 생각합니다.

한국 게임 개발에서의 스크립트 사용은 간단히 말해서 아래처럼 이루어 집니다.

1.    프로그래머가 게임 코어에서 API를 제작한다

2.    프로그래머가 루아 편집기를 열어서, 자신이 뽑아낸 API를 사용하여 로직을 구현한다.

3.    프로그래머가 만들어진 루아 스크립트를 호출하는 코드를 게임내에 작성한다

4.    게임을 돌려서, 루아 코드를 테스트한다.

5.    부족한 기능이 있으면, 또다시 API를 제작하고, 빌드하고, 루아 코드를 수정한다.

사실 이럴거면, 굳이 기능들을 루아 스크립트로 뽑아낼 필요가 없습니다. 그냥 C++ 코어단에서 직접 로직을 만드는게 훨씬 편하고 간단합니다.

굳이 API로 뽑아내고, 익숙하지 않은 루아 코드로 로직들을 어렵게 구현하고, 그것을 게임에서 다시 호출한 코드를 만들 시간과 노력이 왜 필요하겠습니까? 더불어 루아는 브레이크 포인트도 없고, 디버깅도 어렵습니다.. ==;

그냥 C++로 게임 내에서 작성하면 몇줄로 끝날 코드도, 굳이 루아 스크립트를 사용하기 위해서 코드를 작성하면 몇배의 코드와 몇배의 함수들이 생기는 경험은 다들 해보셨을 겁니다.

이것만큼 잘못된 프로세스가 또 어디있을까요? 이건 마치 억지로 루아를 사용하기 위해서, 개발 프로세스를 끼워 맞추는 꼴입니다.

 

프로그래머가 스크립트를 작성해야 하는가?

왜 위와 같이 잘못된 프로세스가 생겼을까요? 원래 루아를 사용할려는 것은 코어 개발자와 게임 로직/컨텐츠/UI 개발자를 구별하기 위한 것이 목적입니다.

, 기획자(디자이너)가 프로그래머가 제공된 기능들을 가지고, 기획 의도대로 마음껏 게임을 개발하고, 변경하고 테스트하기 위한 것이 목적이었던 것입니다.  그래서 프로그래머들은 그런 해외에서 성공한 프로세스들을 공부했고, 그것이 맞다고 배웠습니다.  그렇기 때문에 지금도 열심히 스크립트를 게임에 적용하고 있습니다.

하지만, 한국에서 정작 루아를 공부하는 기획자는 정말로  드뭅니다. 실제로 저도 10년 가까운 개발 경력동안 루아를 코딩할 줄 아는 기획자를 거의 못 봤습니다. 또한 공부하는 기획자 역시도 보지 못했습니다. …. 물론 루아를 공부하는 프로그래머라면 지겹게 봐왔죠. ==;;

실제로 기획자들과 스크립트에 관련된 회의를 하면 아래 처럼 됩니다.

 

프로그래머 : 캐릭터 FSM을 루아로 빼줄 테니, 직접 작성해서 만드세요

기획자 : ?? 내가 왜요? 내가 왜 코딩을 해야 합니까? 나 루아 할줄 몰라요. 그냥 테이블로 만들어 줄께요. 루아 하기 싫어요.

프로그래머: ..그럼 테이블로 만들어주세요. (해달라는데로 해줘야지.ㅅㅂ..)

(그리고 프로그래머는 FSM 관련 API를 만들고, 루아 스크립트로  FSM 코딩을 하고, 게임에 넣어서 개발한다)

 

이렇게 되면 처음 이야기한 것처럼, 굳이 필요없이 스크립트를 사용하는 프로세스가 됩니다. 다시한번 이야기하지만, 이럴 거면 걍 C++ FSM 만드는게코드도 훨씬 간결해지고, 로직도 간단해 집니다. FSM을 루아로 빼기 위해선, 수많은 상태 체크와 관련 함수들을 전부 루아 API로 빼줘야 하기 때문입니다.

 

억지로 스크립트를 써야만 하는가?

위에 언급했듯이 스크립트의 단점은 개발 프로세스가 복잡해지는 것만은 아닙니다.

l  스크립트는 디버깅이 상당히 어렵다

l  스크립트는 VS처럼 전문 개발툴이 없다

l  스크립트는 로딩과 실행 속도가 C++에 비해 몇십배나 느리다.

 

위와 같은 다른 문제점들도 많습니다. 사실 그래서 꼭 스크립트 안 써도 됩니다. 물론 개발하는 게임의 규모가 상당히 커서 스크립트가 꼭 필요한 경우도 많지만, 사실 안 써도 되는 경우도 훨씬 많습니다. 그냥 스크립트가 있으면, 스크립트를 사용하면 더 좋다는 막연한 잘못된 환상으로 억지로 스크립트를 사용하기 위해서 잘못된 프로젝트 구조를 만드는 경우를 훨씬 더 많이 봐왔습니다.

물론, 가장 좋은 사용법은 앞에서 언급했듯이 코어 프로그래머와 로직을 구현하는 디자이너가 분리되어 자신의 역할을 잘할 때 가장 효율적으로 스크립트를 사용할 수 있습니다. 그렇지 않은 것이 현재 한국 개발의 현실인 것을 감안하면굳이 억지로 스크립트를 사용해야 한다는 환상을 가지고 개발 프로세스를 더욱 복잡하게 만들어 버리는 케이스가 더욱 많습니다.

 

이러한 경우라면 저는 억지로 스크립트를 사용하지 않아도 된다고 생각합니다. 왜 굳이 무엇을 위해서 어렵게 코드를 만들고, 디버깅할때 C++에서 루아를 따라가야 하며, 제대로 디버깅도 되지 않는 스크립트를 써야 할까요? (디버깅하다가 루아 호출 함수를 만나면, 노트패드에서 루아 코드를 꺼내 봐야 하죠. 그것도 브레이크 포인트도 안걸리는 코드를…)

지금 혹시여러분도 억지로 스크립트를 사용해야 하기 위해서, 스크립트를 게임 코드에 붙이고 있지는 않나요? ^^;

반응형
,
Posted by 알 수 없는 사용자


1. 들어가며

  안녕하세요. 앞으로 저와 같이 함께 둠3 소스를 분석해보겠습니다. 먼저 빌드부터 해보겠습니다.



2. 소스받기

  둠3 소스는 Visual Studio 2010 솔루션으로 세팅되어있습니다. 아쉽게도 Express 버전은 진행이 매끄럽지 않습니다. https://github.com/TTimo/doom3.gpl 에 가셔서 메뉴 "Downloads"의 "Download as zip" 버튼을 눌러서 풀소스를 다운로드 받습니다. 압축 파일을 푸시고 안에 들어있는 폴더 이름 TTimo-doom3.gpl-7db8be7을 TTimo-doom으로 바꿔줍니다. 그리고 C:\ 로 옮깁니다. 최종 폴더 구조는 다음과 같습니다.





3. 게임설치

  게임은 아래 두가지 방법으로 설치할 수 있습니다.

 - CD 설치
 - 스팀 구매 (http://store.steampowered.com/sub/425/)

  CD 설치는 둠3, 둠3-확장팩(Resurrection of Evil)을 설치하시고 1.3.1 패치까지 해주셔야 합니다. 스팀 구매는 위의 링크로 가셔서 Doom3 Pack(오리지날+확장팩)을 구입하시면 됩니다. 결제 후 다운로드만 받으시면 됩니다. CD는 구하기도 쉽지 않고 공개된 프로젝트의 기본 경로도 스팀으로 되어있어서 스팀 구매를 추천합니다.



4. 빌드

  C:\TTimo-doom\neo\doom.sln 파일을 엽니다. 메뉴에서 빌드(Build) -> 구성 관리자(Configuration Manager)를 클릭하시고 "Debug"로 활성화시킵니다. F7 키를 눌러서 빌드를 시작합니다. 빌드 중에 몇가지 에러가 발생합니다.

  C:\TTimo-doom\neo\sys\win32\win_input.cpp(146) 에서 첫번째 컴파일 에러가 발생합니다. 코드페이지 문제로 글자가 깨집니다. 다국어 지원쪽이라 소스분석과 크게 상관없어 해당 부분을 삭제하겠습니다. win_input.cpp 파일의 100줄~252줄까지 삭제합니다. 다음, Sys_InitScanTable 함수에서 else if ( lang.Icmp( "spanish" ) == 0 ) 부분 부터 해당 함수의 마지막 줄까지 삭제합니다. 결론적으로 s_scantokey_spanish, s_scantokey_french, s_scantokey_german, s_scantokey_italian 배열 변수를 사용하는 부분들을 지워주시면 됩니다. (수정된 win_input.cpp 파일을 첨부했습니다. 해당 경로에 덮어쓰기 카피를 해주세요.)

  다시 F7키를 눌러 빌드를 걸면 C:\TTimo-doom\neo\sound\snd_system.cpp 에서 두번째 컴파일 에러가 발생합니다. 166줄에서 #if ID_OPENAL ~ #endif 으로 감싸져 있는 부분을 주석처리합니다. (수정된 snd_system.cpp 파일을 첨부파일로 올렸습니다. 덮어쓰기 카피를 해주세요.)

  이제 빌드가 성공하고 F5 키를 눌러서 게임을 실행시킬 수 있습니다. 그럼 씨디키를 물어보는데요. 이것도 귀찮으니 소스 수정으로 통과해보겠습니다. 

  C:\TTimo-doom\neo\framework\Session.cpp 파일에서 2985줄 ReadCDKey 함수를 보시면 중간에 cdkey_state = CDKEY_UNKNOWN; 문장과 xpkey_state = CDKEY_UNKNOWN; 문장이 있습니다. 이것들을 각각 cdkey_state = CDKEY_OK; 와 xpkey_state = CDKEY_OK; 으로 수정해줍니다. 다시 F5 키를 눌러 실행시키면 씨디키를 물어보지 않음을 볼 수 있습니다. (수정된 Session.cpp 파일을 첨부파일로 올렸습니다. 덮어쓰기 해주세요.)

  게임 메뉴에서 Option -> System 으로 들어가셔서 Screen Size는 적절하게 줄여주시고 FullScreen은 No로 해주시면 디버깅 할 때 편리하겠습니다.







5. 마무리

  소스코드 읽기는 현업인에게 요구되는 중요한 능력입니다. 입문자들은 특히 꼭 한번쯤은 경험해봐야 할 산이라고 생각합니다. 잘 만들어진 게임의 에셋과 소스 모두를 구비해서 분석할 수 있는 기회는 흔치 않습니다. 그런 경험은 본인이 참가하고 있는 프로젝트에 국한될 수 밖에 없는데요. 그런 측면에서 둠3 소스는 존카맥님이 주시는 매우 좋은 재료가 될 수 있습니다. 앞으로 저와 같이 작은 클래스들부터 시작해서 차근차근 정복해보아요~


반응형
,