336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이 글은 10년도 작성한 KGC2010 후기들 백업임


 

메가 스플래팅 (Mega Splatting) - KGC2010 Game develop

오늘 KGC2010에서 "메가 스플래팅" 세션을 듣고 왔지요. 바로 적용 해볼 수 있는 유용한 팁을 얻은 것 같습니다. 강연자분께서 바로 발표자료를 올려주셨네요. 

링크 : 메가 스플래팅 (Mega Splatting) - KGC2010 발표 by 노동진

솔직히 처음에는 초큼 실망이였습니다. "메가 스플래팅"이라길래 저는 존 카멕 아저씨의 "메가 텍스쳐"를 이야기 하는 줄 알았더랬지요. 하지만 반전이였어요. 강연자분이 개량하신 스플래팅 기법의 네이밍이더군요. 게다가 초반에는 터레인 텍스쳐링의 역사를말씀하시고 "메가 스플래팅"은 꼴랑 한장에 업급되더군요. 다른 세션 들으러 갈까 하고 잠깐 흔들렸습니다.
그러나 실망은 잠시였습니다.
저희 엔진은 원경의 패치는 미리 구워놓은 통맵으로 랜더링 해서 비용을 절약하고 있습니다. 하지만 노동진님은 이 방식을 삽질사례#2로 편입시키고,  꽤 좋은 아이디어를 말씀해주시더군요. 

한마디로 간략하게 하자면, 멀리 있는 패치( DP호출하는 단위 묶음. 각가 이를 칭하는 용어가 다른데 저는 이렇게 부르는게 편합니다;;)부분은 매번 스플래팅으로 그리는게 아니고 랜더 타겟에 스플래팅으로 한번 랜더링 하고 그 결과를 매번 가져다 써서 비용을 절약한다는 것입니다. 멀리 있는 것일수록 해상도는 낮게 하구요.  

한가지 우려되는 것은 랜더 타겟 생성 및 삭제 관리를 어떻게 하느냐였습니다. 패치 단위로 랜더 타겟을 보유하고 있고, 시야에 들어 올 시점에 타겟을 생성하고, 시점 반경에서 멀어지면 타겟을 삭제하는 등의 행위가 필요할텐데, 이 과정이 느리지는 않을까 말이죠. 강연자분은 그 과정이 우려하는 만큼 시간이 걸리지는 않는다더군요. 
얼마나잘 관리하느냐가 관건일 것 같습니다만 설사 문제가 된다 하더라도, 케릭터가 열심히 달리기만 하는 경우는 살짝씩 프레임이 떨어져도 큰 문제가 없지 않을까 싶기도 해요. 전투중의 이동은 패치 디테일이 크게 변할 일이 없을테니까요. 아, 카메라 회전은 있겠네요.
아이디어가 복잡하지도 않고 기존 랜더 파이프를 크게 바꾸지 않고 적용을 해 볼수 있을 것 같으니 저도 한번 적용해서 테스트 해 봐야지 싶습니다.


저사양 고퀄리티 MMORPG의 개발사례 - KGC2010 Game develop

저는 이번 KGC2010에서 한빛소프트의 "저사양 고퀄리티 MMORPG의 개발사례"를 듣게 되었죠. 
제가 너무 욕심을 냈던 것일까요. 저는 뭔가 한빛 소프트만의 독자적인 노하우를 알려주실거라 기대했습니다. 
하지만 초반에는 저사양 저용량이면 뭐가 좋고 고퀄리티면 뭐가 좋고 이러쿵 저러쿵 당연한 이야기만 나오더군요. 아.. 또 낚였구나 싶었습니다. 파닥 파닥
세션 제목이 "저사양 고퀄리티"가 아니라 "저사양 대비 고퀄리티"가 되어야 했습니다. 사양을 낮추기 위해 SM1.1로 작업을 했고 노말맵을 안썼고, 림 라이팅을 PS가 아니라 VS에서 했고 등등 특별한 노하우보다는 일반적인 이야기만 나오더라구요. 
김진호PD님 강태공이였습니다. 
아뇨, 사실은 제 잘못입니다. 무슨 게임에 관한 내용인지, 그 게임이 어떤 게임인지를 알고 갔어야 했지요. 세션 제목만 보고 멋대로 덥썩 환상을 가져버린 제 탓이지요. 

하지만, "게임 시장의 동향 및 신기술 소개 :AUTODESK"처럼 슈퍼 대어 월척은 아니였습니다. 사양 대비 고퀄리티인 것 만은 확실하더군요. 쥐포네마리 VGA에서도 돌아가는 정도면 "MU" 정도의 사양인데, 퀄리티는 그에 비할바가 아니더군요. 그렇다고 뮤가 퀄리티가 구리다는것은 아니니 오해 마시길 바랍니다. 그만큼 에이카의 퀄리티가 높다는 것입니다. 뭐, 직접 게임을 해보지는 않고 스샷만 본것이지만요.
Geforce4에서 나올 수 있는 그래픽이라기엔 너무 좋지 않나요.

그리고, 듣다보니 중반부터 쓸만해 보이는 아이디어들이 나오더군요. 아직 김PD님이 세션 강연 자료를 올리시지는 않은 것 같습니다. 제가 개인적으로 직찍한게 있긴 하지만 폰카라 구리고, 다른 분들이 잘 정리해서 올려주신 것이 있어 자세한 내용은 아래 링크로 보시길 바랍니다.


개인적으로 기억에 남는 아이디어들:
- 리플렉션도 특성상 필요한 부분에만 사용 : 반사 효과는 비용이크기때문에 항상 최적화가 필요한 부분입니다만, 에이카에서는 과감하게 쓸데 안쓸데를 구분해서 사용하네요. 마을같이 프레임이 상대적으로 떨어져도 상관 없는 부분은 퀄리티를 높이기 위해 반사를 사용하고, 사냥터같은 부분에서는 최대한 억제한다네요.
- 케릭터가 100개 넘으면 100개만 랜더 (메모리 pool 이야기 중): 전쟁같이 한 화면에 케릭터가무수히 나올 경우 100개가 넘으면 100개인지 110개인지 유저 눈에는 그저 사람이 많은걸로만 보입니다. 그래서 편법으로 100개 넘으면 100개만 랜더한다고 하네요. 
- byte alignment : 잘모테써효 ㅠㅠ 그동안 쌩까고 코딩하고 있었어요. 자신을 돌아보는 계기가 되었습니다.

결론적으로는 1시간이 아깝지 않은 세션이였습니다. 짝짝짝~! ( 씹고 뜯고 맛보고 즐기고 -ㅈ-;)


Posted by ozlael
,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

C9 Rendering Game develop

C9 Rendering



최대한 MRT를 배제하고 64bit 하나에다 깊이 노말등을 때려 박는게 인상적이네요.
스킨이랑 헤어 관련 이야기도 나왔으면 더 좋았으련만..

의문 사항 :

Zcull ( EalryZ ) 를 통해 평소 20~25fps -> 40fps이상 유지
 G-buffer를 구축하기 전에 early-Z 패스를 따로 두어서 처리를 했다는 의미인지, 
 G-buffer 패스가 early-Z의 효과를 가졌다는 의미인지

- A16FR16FG16FB16 포멧으로 설정
- A : Depth
- B : ViewPosition과의 거리
 Depth 정보가 있는데 뭣하러 ViewPosition과의 거리를 따로 저장 하는지


Posted by ozlael
,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이 글은 10년도 작성 글 백업

-------------------------------------------------


Encoding floats in GPU Game develop


Posted by ozlael
,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이 글은 10년도 작성 된 글 백업임

--------------------------------------------------------------------



RGBA16 버퍼(unsigned 64bit)에 두 개의 값 밀어넣기 Game develop

최근 작업 중 짱나는 부분이 있어 여러분께 조언을 좀 여쭙고자 글을 씁니다.

64bit unsigned 랜더 타겟에 두 개의 값(디퓨즈,일루미네이션)을 끼워넣는 시도를 하였습니다.
각 채널 당 unsigned 16bit이므로 각각 8비트씩 할당하여 한 채널에 두 개의 값을 저장하는 것입니다.

Write 부의 절차는 대강 이러합니다:
1. 디퓨즈, 일루미네이션 각각의 0~1의 float값에 255를 곱하여 0~255의 int로 변환
2. 1의 디퓨즈에 256을 곱하여 8bit shift 효과(DX9의 PS에서 bit shift 연산 사용 불가)
3. 2의 쉬프트된 값과 1의 일루미네이션 값을 더함(앞8bit:디퓨즈 뒤8bit:일루미네이션)
4. 3의 값을 25535로 나누어 타겟으로 출력

Read 부의 절차는 대강 이러합니다:
1. 읽은 0~1의 float값에 25535를 곱하여 int로 변환
2. 1의 값을 256으로 나누어 8bit 쉬프트 효과
3. 디퓨즈 값 = 2의 값 / 255
4. 2의 값에 256을 곱하여 앞8bit:디퓨즈 뒤8bit:0 으로 만듦
5. 일루미네이션 값 = (1의 값 - 4의 값) / 255 

일단은 의도대로 성공 했습니다...만, 지포스 7600에서는 비 정상 작동하더군요.
다른 카드도 더 검증을 해봐야겠습니다.

왜 어떤 VGA는 되고 어떤 VGA는 안되고 그러는지 답답하더군요. 제일 중요한 문제는 이 방법이 정상 작동 하는지의 판단 기준을 어떡해야 할지를 모르겠다는겁니다.(원인 파악이 되면 자연스레 해결 될 수도 있겠지만요::) 어떤 기능의 지원 여부에 따른 것이라면 쿼리를 날리던 캡스를 뒤지던 할 텐데... 

혹시 의심가는 부분이라던가 비슷한 문제 사례가 있으시면 한모금 던져주시면 로또맞으실겁니다 ㅎㅎ

덧글

  •  cagetu 2010/12/29 11:05 # 삭제 답글

    설마 텍스쳐 포멧을 지원하지 않는것은 아니겠죠?! ^^;;
  •  오즈라엘 2010/12/29 11:13 # 수정 삭제

    해당 포맷으로 랜더 타겟은 정상 생성 되고 PIX로 확인해보면 출력도 됩니다.ㅠㅠ
  •  냥냥양 2010/12/29 23:41 # 삭제 답글

    이게..

    직접적인 ( / 25535 ), ( * 255 ) 요런식으로 하는게 아니라. ceil(), floor(), 요런건로 써서 해보세요.

    기억이 맞다면 될거같아요..ㅡ_ㅡ;;;

    근데 frac() 요건 그래픽카드마다 결과값이 달라서..영...amd에 문의 해도 대답없고;;;

    그리고...64 unsigned int 이거 느리지않던가요??
  •  오즈라엘 2010/12/30 11:02 # 수정 삭제

    답변 감사합니다만 제가 이해가 안가서 자세히 풀어서 설명좀 부탁드릴게요 ㅠㅠ
    올림, 내림이 무슨 연관이 있는 것인지 ㅠㅠ
    ATi나 NVIDIA에 문의 메일은 의미가 없어요ㅋ 절대 대답 안해줌 ㅋ
    개발 가이드 문서의 틀린 내용도 바로 바로 수정 안하는 녀석들인데요 뭐 ㅋ
    uint 64bit은 아직 속도 체크는 아직 안해봤는데, RT를 낭비하지 않으려면 선택의 여지가 없어서요 ㅎㅎ
  •  냥냥양 2010/12/30 17:33 # 삭제 답글

    http://theinstructionlimit.com/?p=33 바로 밑에 이거 얘기 한거에요.

    렌더타겟줄이실라고 그런거죠?

    제가 방금 테스트해봤는데, amd계열은 속도가 훌륭하고, nvidia계열은 암울하네요...어흑
  •  오즈라엘 2010/12/31 01:28 # 수정 삭제

    감사합니다 ㅎ

    " there is no native integer math on GPUs before SM4.0"
    이 문장을 제대로 보질 못했었네요 ㅎ 이 문장 대로 제대로 처리를 못해서 7600에서는 결과가 이상하게 나오나봅니다. 
    아래에 링크된 글들을 보면 흐름과 컨셉은 알겠는데, 왜 frac()이 비트 쉬프트의 의미를 가지게 되는지 이해는 안가더라구요. 소수부의 숫자들이 어떻게 bitwise의 효과를 가지게 되는 건가요ㅜㅜ?

    nvidia 계열은 어떤 모델로 테스트해보신건지요? 저는 PF64랑 UINT64랑 별 속도 차이는 없어보이던데''
    아직 7600에서는 정상적으로 돌지 않아 비교를 안해봤고 8600이상에서 비교해봤습니다.
  •  냥냥양 2011/01/01 13:55 # 삭제 답글

    float Float2Encode( float2 vecEncode )
    {
    vecEncode = floor( float2( vecEncode.x * 255.0f, vecEncode.y * 255.0f ) );
    float fResult = floor( floor( vecEncode.x * 255.0f ) + vecEncode.y ) / 65535.0f;
    return fResult;
    }

    float2 Float2Decode( float fDecode )
    {
    fDecode = floor( fDecode * 65535.0f );

    float2 vecResult;
    vecResult.x = floor( fDecode / 255.0f );
    vecResult.x /= 255.0f;
    vecResult.y = frac( fDecode / 255.0f );

    return vecResult;
    }

    이렇게 대충 코딩해 봤는데 문제는 Decal때문에 AlphaBlend를 하고있는 부분이 깨지네요..ㅠㅠ
  •  오즈라엘 2011/01/03 13:59 # 수정 삭제

    알파 블렌드로 하면 OTL ㅠㅠ G-buffer에서 사용하고 계시지 않으신가요? 데칼 등 알파 블렌드가 필요한 부분은 별도 패스로 덧그리셔야 할겁니다 ㅜㅜ
    그나저나 7600에선 여전히 비정상이네요 ㅠㅠ
  •  냥냥양 2011/01/04 01:04 # 삭제 답글

    걍 필요한 부분만해서 큰득은 봤네요.. 그나저나 7600구해서 저도 돌려봐야겠네요..
  •  오즈라엘 2011/01/04 11:30 # 수정 삭제

    지포스 7시리즈, 6시리즈 모두 그러더군요. 개네덜은 반정밀도로 계산을 하는건가;; D3DXSHADER_PARTIALPRECISION 옵션을 넣지도 않았는데 그러네요.. 쩝;;
    6,7 시리즈는 좀 까리까리한게 있는데, 개발 가이드 문서(http://developer.download.nvidia.com/GPU_Programming_Guide/GPU_Programming_Guide_Korean.pdf)에서는 A16B16G16R16 텍스쳐가 지원 되지 않는다고 나와 있습니다. 하지만 실제로 caps를 뒤져보면 지원을 하더군요. 애초에 지원을 하지를 말던가.. 원..
  •  오즈라엘 2011/01/07 00:48 # 수정 삭제

    7600에서 돌려보셨나요? 엔비댜에 문의하니 낮은 정밀도로 연산 된다거나 하는 것은 딱히 없다고 하네요. 문서에 UINT64 포맷 지원 안한다 나와있는 것은 실수지만 언제 고칠지는 모른다능 ㅋ
  •  냥냥양 2011/01/11 10:15 # 삭제 답글

    제 주위에 7시리즈가 없네요..ㅠㅠ 6600하나 있긴한데 그거 달아서 테스트하기는 귀찮아서..

    전 6&7은 버텍스단위에서 라이트계산하고 그림자도 빼고, 포워드로 렌더링하려구요.. 그런거 다 하기엔 

    넘힘드네요.. 것보다.. m330에서 돌려봤더니 좌절이라. 그쪽 최적화해야겠어요
  •  오즈라엘 2011/01/12 23:13 # 수정 삭제

    저 역시 6,7 시리즈는 답이 없어서 걍 bit-wise 하는 행위를 그냥 빼버렸습니다. ㅎ 
    테라처럼 쌩 디퓨즈만 지원하는 옵을 추가해서 커버하려구요
    해상도가 점점 커져가는데 6,7 이넘들은 이를 따라올 수가 없네요.
    mx330 말씀하시는 것인가요? 그넘도 지원하시나요 +ㅈ+?
  •  냥냥양 2011/01/15 09:39 # 삭제 답글

    m330은 그냥 노트북용이에요.. 요즘 노트북으로 게임하는 유저들이 많아져서..
  •  오즈라엘 2011/01/15 14:52 # 수정 삭제

    아.. 노트북용 ㅋㅋ 제가 무식한 소릴 했었네요 죄송함다 ㅋㅋ
    노트북용 하면 인텔 GMA가 대박이죠 ㅎ 
    인텔칩도 스펙상으로는 허용 범위라 신경써야될 밴더가 더 많아졌습니다
    OTL


Posted by ozlael
,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이 글은 11년도 작성 된 글 들 백업임

-------------------------------------------------------


Game Tech 2011 - 테라에 사용된 렌더링 테크닉 Game develop

"테라에 사용된 랜터링 테크닉"은 게임테크 2011 참관기 (이어서)에서 잘 소개되어 있습니다. 저보다 앞자리에,서 저보다 정면에서, 거기다가 저보다 좋은 화질로(쳇, 은근히 샘나요;;) 있으니 참고하시면 될겁니다 ㅎ 그리고 다음주면 게임 테크 슬라이드들이 풀린다는 소식이;;;

 GameTech 2011 - MMORPG 게임, 엔진 최적화 기법 Game develop

나능야 남들 다 "예"할때 혼자 "아니오"라고 하는 남자! 모두들 사마리아인 데모를 볼때 나는 "MMO 게임, 엔진 촤적화 기법" 세션을 보러 갔습니다. 솔직히 사마리아인 보고싶어서 뒈지는줄 알았습니다만, 영상이랑 슬라이드는 지겹도록 봤으니 굳이 볼 필요는 없다고 판단했습니다. 

사마리아인 데모 기술 참고 : 

제로딘 엔진의 이 세션은 KGC에서도 했던 같은 내용인 것 같더군요. KGC에서 이 세션을 막바지에나 들어가서 아쉽기도 해서 "2년째 우려먹다니, 날 뭘로보고! 넥슨의 리깅 시스템 세션은 NDC, KGC, GDC 세번이나 발표될 만큼 좋은 내용이였잖아? 제로딘 세션도 그만큼 좋은 내용이라는 뜻이겠지?" 라는 생각으로 발걸음을 옮겼습니다. 
솔직히 KGC때는 절반이 엔진 광고여서 이번에도 어느 정도 각오는 하고 들었습니다만, 괜챦더군요.

역시나 예상대로 사람들은 거의가 사마리아인 세션으로 몰렸고 제로딘 세션은 썰렁했습니다. 장대표님은 무슨 죄길래 시간대가 이렇게 잡혔나 싶었는데, 오히려 생각보다 많이 들어줘서 고맙다고 하시능... ㅋㅋㅋ

역시 행복은 마음속에 있나니 ~




제로딘 엔진을 사용한 드라고나 살짝 끼워넣는 깨알같은 센스 ㅋㅋ
동남아 권은 메모리 1G도 안되는 경우도 허다하다고 합니다. 
메모리 단편화를 막기 위해 메모리 풀을 사용하지요. 하지만 반전으로, 제로딘에서는 메모리 풀은 사용하지 않는다고 하네요. 완벽하지 않으면 아니한만 못함. 두둥
역시 피날레는 케릭터 인스턴싱. 4개의 케릭터를 하나의 call 데이터로 꽉꽉 눌러 담는 것이 데이터를 익스포트 시 프리 컴퓨팅 하거나 그런줄 알았는데, 실시간이라는군요. LOD 연산까지도요. 아래 동영상의 로딩 타임이 그 연산 과정인가 봅니다.


 GameTech 2011 - 온라인 게임개발을 위한 크라이엔진3의 케릭터 에니메이션 파이프라인 Game develop

트랙2의 "온라인 게임개발을 위한 크라이엔진3의 케릭터 에니메이션 파이프라인" 역시 이번 게임 테크 2011의 책자에 슬라이드가 사전 등록되지 않은 내용입니다. 강연자분의 설명을 들어보니 원래는 개발중인 게임의 개발 프로세스를 보여주려 했으나 바이어의 반대로 내용을 바꿨나봐요.

LMG는 크라이 엔진이 에전부터 쭈욱 사용되어 오던 시스템이라고 합니다. 보통은 걸으면서 회전을 하면 마치 제자리 걸음을 하면서 회전하는 듯 한 어색함이 연출되는데, LMG는 자연스러운 연출을 할 수 있다네요.


뛰기, 걷기, 회전 등의 여러 에니메이션을 상황에 맞게 가중치를 두어 블렌딩 하는 방법인 듯 합니다. 에니메이션 자체에도 풋스텝 정보가 들어있는 걸까요?

시연 영상의 모습입니다. 이때쯤이였던가 보여주고 싶은 케릭터를 공개 못해서 투털 아쉬워 하시더군요 ㅋ 그심정 모두들 동감하실겁니다 ㅋ


LMG는 하체를 위한 방식이라면 레이어링은 상체를 위한 방식입니다. 동일한 달리기 모션 상태에서 총들기, 수류탄 들기 등 다양한 상체 모션을 적용 하게 하는거죠.
레이어링 시연 동영상입니다.




케이스 바이 케이스 에니메이션을 일일이 만들면 끝이 없죠. 애디티브는 몇 개의 리소스로 다양한 상황에 맞는 에니메이션을 만들어 낼 수 있는 방법인 듯 합니다. 동영상을 올려야되는데 파일 용량 제한이.. 흑..
시연을 보여주신걸 말로 설명을 드리자면, 위 아래 허리를 숙였다 폈다 하는 에니메이션 급조하고, 그걸 달리는 모션에 가중치 두어 애디티브 시키면 최종적으로는 숙였다 폈다 하면서 달리고, 가중치를 변경하여 원래 만들었던 것 보다 더 숙인 상태에서 숙였다 폈다가 하는데.. 아 뭐래는거야..



당빠 IK 들어가주시고요.


원래 만들었던 에니메이션하고 IK를 적용했을 때하고 안맞는 경우가 발생한다고 합니다. 무기를 교체하는 동안 손이 딴데를 잡고 있는 다던가... 그런 경우 리타겟팅을 통해 위치 보정을 한다네요.
리타게팅 시연 영상입니다.


뭐, 물리엔진도 있구요. 피직 본을 이름규칙으로 단계적인 세그먼트 사용이 가능하다네요. 피직 셋팅은 맥스가 아닌 툴에서 한다고 합니다. 아옼! 망할 이글루스. 동영상이 용량 제한에 걸려서 또 못올리네요. 이글루스 뒈져버렷!


게임 엔진과 맥스 사이의 괴리(?)는 게임 개발에서 많이 겪는 일이죠. 모션 캡쳐 역시 데이터를 편집해서 적용해서 확인하는 것도 불편하구요. Live Sync는 이런 프로세스를 간결화 시켜줍니다. 

Live Sync는 GDC에서 공개된 그 영상을 보시면 됩니다. http://www.youtube.com/watch?v=TXnXOn7WRCs





Posted by ozlael
,