'2016/08'에 해당되는 글 31건

  1. 2016.08.31 Debug.Log() 사용 시 주의점 1
  2. 2016.08.31 등짝을 보자 - 단편 수필? ㅋ
  3. 2016.08.31 유니티로 배우는 게임 수학 (한빛) 1
  4. 2016.08.31 The Game Graphics : 모델링과 텍스쳐링 #1 - 비엘북스
  5. 2016.08.31 The Game Graphics : 유니티 언리얼 VR - 비엘북스
  6. 2016.08.31 그래픽 최적화로 가...가버렷! (부제: 배치! 배칭을 보자!) , Batch! Let's take a look at Batching! (Unite Seoul 2016)
  7. 2016.08.31 유니티 그래픽 최적화, 어디까지 해봤니 (Unite Seoul 15, NDC15)
  8. 2016.08.31 스티브잡스처럼 프레젠테이션하기
  9. 2016.08.31 유니티의 라이팅이 안 이쁘다구요? (A to Z of Lighting) (CGC2014)
  10. 2016.08.31 쿠킹스타 제작 사례로 보는 COCOS 2D-X 소개 (KGC2013)
  11. 2016.08.31 디퍼드 렌더링 케이스 스터디 (KGC12)
  12. 2016.08.31 PC에서3D 입체 영상 게임 개발하기 (KGC11)
  13. 2016.08.31 optimize Modern GPU
  14. 2016.08.31 DOF
  15. 2016.08.31 SSAO
  16. 2016.08.31 Inferred lighting
  17. 2016.08.29 G-buffer Normal을 R16FG16F 포맷으로 사용 시 Z 부호 문제 1
  18. 2016.08.29 디퍼드 랜더 시스템 개략( Forward, Deferred, Light Prepass, Inferred)
  19. 2016.08.29 Compact Normal Storage for Small G-Buffers (from Aras)
  20. 2016.08.29 shader constant array를 이용한 Mesh Instancing
  21. 2016.08.29 SSAO (Screen Space Ambient Occlusion) 링크 모음
  22. 2016.08.29 [번역] Two-part shadow maps :wolfire ( AO와 Shadow map)
  23. 2016.08.29 [번역] Environment shadows - step 4 By David Rosen on April 10th, 2009
  24. 2016.08.29 망할 SSAO halo 현상 !!!
  25. 2016.08.29 KGC2010 후기들
  26. 2016.08.29 C9 Rendering 1
  27. 2016.08.29 Encoding floats in GPU
  28. 2016.08.29 RGBA16 버퍼(unsigned 64bit)에 두 개의 값 밀어넣기
  29. 2016.08.29 GameTech11 후기들
  30. 2016.08.29 NDC11 세션 후기들
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

게임을 개발하는 과정에서 콘솔 로그를 출력하는 것은 필수적입니다. 당연히 유니티에서도 로그를 출력하는 함수가 존재하고 Debug.Log()를 많이 사용하시죠.

Manual : https://docs.unity3d.com/ScriptReference/Debug.Log.html 


근데 많이들 오해하시는게, 이 Debug.Log 함수는 Debug클래수 함수니까 Development Build일 때에만 작동하고 릴리즈 빌드때는 자동적으로 제거된 다고 오인하시는 것입니다. 콘솔 출력용으로 남발해서 사용되도 최종 릴리즈에는 영향 미치지 않는다고 오인하시는 경우가 많습니다, 하지만 아쉽게도 그렇지 않습니다. Debug.Log()는 릴리즈 빌드때고 고스란히 작동합니다. 따라서 쓸데 없는 성능을 쉽게 잡아먹는 녀석중 하나가 되버리죠.


예를 들어서 다음과 같이 콘솔 출력용 로그를 수없이 찍는 코드를 만들고

public class TestLog : MonoBehaviour {


public int logCount = 500;

public string testStr;

void Update () {

for( int i=0; i< logCount; i++) {

UnityEngine.Debug.Log("test log : " + testStr + "!" );

}

}

}

빈 프로젝트에서 위 코드만 돌린 프로젝트를빌드하여 홍미 폰에 띄우니 30FPS로 돌아갑니다. 디벨롭먼트 빌드가 아닌데도 불구하구요. 물론 실제로 매 프레임마다 500번의 출력을 하는 경우는 실존하지 않을 것입니다. 테스트를 보여주기 위하여 극악의 상황을 만들어본 것 뿐입니다. 다만, Debug.Log()가 쓸데 없이 작동하는 것을 증명하기에 충분한 코드겠지요. 


이러한 쓸데없는 행위를 막기 위해서 #if 디파인문을 많이들 사용하십니다. 다음과 같이요

#if TRACE_ON

UnityEngine.Debug.Log("test log : " + testStr + "!" );

#endif

이렇게 두고 플레이어 셋팅의 Scripting Define Symbols이나 .rsp 파일에 TRACE_ON을 추가하한 경우에만 수행되고 아닌 경우에서는 Debug.Log()가 수행되지 않고 60FPS가 잘 나옵니다.

Manual : https://docs.unity3d.com/Manual/PlatformDependentCompilation.html

이제 문제가 전혀 없습니다. 없을까요? 

있습니다. 귀찮은게 문제지요.


Debug.Log()를 출력하는 곳이 한두군데도 아니고 매번 작성할 때 마다 #if #endif로 묶으려면 매우 귀찮습니다. 게다가 실수로 잘못 묶으면 짜증이 짜증이 아휴~



대안으로는 Conditional를 사용하시면 편합니다. Debug.log()를 래핑하는 클래스를 만들고 함수에다가 Conditional를 선언하면 됩니다.

using UnityEngine;

using System.Collections;

using System.Diagnostics;


public class TestLog : MonoBehaviour {


public int logCount=500;

public string testStr;


[Conditional("TRACE_ON")]

void DebugLogWrap( string str) {

UnityEngine.Debug.Log(str);

}

void Update () {

for( int i=0; i< logCount; i++) {

DebugLogWrap("test log : " + testStr + "!" );

}

}

}

TRACE_ON 디파인이 켜져있지 않는 경우에는 DebugWrap을 호출하는 라인이 통채로 무시됩니다. 따라서 #if 디파인을 매번 사용하지 않고도 같은 효과를 볼 수 있습니다. 사실 저도 얼마 전에 알게 된 것인데 굉장히 편하네요 ㅋ C# 짱짱맨 :)

MSDN : https://msdn.microsoft.com/en-us/library/4xssyw96(v=vs.90).aspx


궁극적으로는 다음 링크처럼 사용하시면 됩니다 : 

https://gist.github.com/kimsama/4123043


끗!


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

어느 날 자고 일어나니 다리가 넷 아니 뜬금없이 두통이 생겼다. 혹시 생일날 선물 안사줬다고 나 자는사이에 몰래 뒷빡 갈긴건 아닌가 하고 와이프를 추궁해봤지만 지는 결백하댄다. 내년 생일도 쌩까야지 하고 소심하게 다짐하면서 냅뒀는데 계속 두통이 사라지질 않는 것이다.

참다 못해 동네 약국에 갔더니 약사 아재는 쿨하게 두통약을 던져주더라. 허나 두통약을 먹어도 그때 뿐 여전히 두통은 심해져만 갔다.

이등병의 남은 군생활마냥 두통이 계속 사라지지 않자 일주일째 지속되던 날 결국 회사 근처 아무 내과에 들렀다. 의사 아재는 내 설명을 차근차근 듣더니 갑자기 윗도리를 벗으랜다. 그러고는 내 등 뒤로 가서는 등짝 등짝을 보잔다. 머리아프다는데 웬 등짝이지 이게 뭔 피카츄 파이어볼 쏘는 소린가 내가 역시 마성의 게이라서 노말벡터도 바이노말벡터로 만들어버린건가 싶었지만, 너무나도 당당한 의사 아재의 눈빛에 그만 등짝을 내주어버리고 말았다. 

비루한 내 염통은 눈치도 없이 쫄깃해지며 발랑발랑 거리던 순간 아재의 보드라운 손길이 내 등짝과 목덜미를 어루만졌고 나는 그만 비명인지 신음인지 모를 단말마의 비명소리를 내지르고 말았다. 

아프다. 분명 갱킹을 갔는데 뜻하지 않게 렝가에게 부쉬칼빵을 맞고 갱승당한 것 마냥 뜻하지 않게 아프다. 분명 머리가 아파서 병원엘 갔는데 등짝이 아프다.

알고보니 이유인 즉슨 이러했다. 나는 사실 머리가 아픈게 아니라 등짝이 아픈거였다. 신경이 등짝부터 머리까지 연결되어있기 때문에 등짝 근육이 뭉쳤는데 애꿏은 머리가 아팠던 것이였다. 그러니 두통약을 쳐먹어봤자 발업 안한 저글링마냥 스팀팩 없는 마린새끼마냥 골골댔던 것이였던 것이였다.

의사 아재의 안내대로 피카츄 전기 공격으로 등짝을 몇 분 맛사지 해주니 두통이 대통령 선거 공약같이 말끔히 사라졌다.

마냥 신기했다. 처음에는 마냥 신기했는데 곰곰히 생각해보니 내가 곰이네 아니 곰곰히 생각해보니 의사 아재는 훌륭한 필드 엔지니어였다. 비록 내 몸뚱아리는 신이라는 개발자가 자연의 섭리라는 거대한 플랫폼 하에 만들어낸 것이지만, 의사 아재는 시스템을 정확히 이해하고있는 통찰력으로 내 몸뚱아리를 너 로맨틱 성공적으로 디버깅 한 것이다. 그렇기에 그의 눈빛은 자신감에 차있었으며 나는 그 자신감 넘친 눈빛에 매료되어 등짝을 내주고 말았다.

하지만 나는 어떠한가? 나는 시스템을 깊이 이해하는 통찰력을 가지고 코딩을 해왔는가? 난 그저 머리아프다고 무조건 두통약을 내어준 동네 약사와 다를 바 없이 디버깅하지는 않았는가? 

많은 고민을 하고 나를 돌아보게 만들어준 두통이였다.


(페북에 올렸던 글인데 나름 호응?이 좋아서 백업 ㅋㅋ)

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

게임 수학을 다루는데, 다른 서적들보다 난이도를 낮게 잡고 있으며 유니티 예제들로 직접 확인을 해 볼 수가 있습니다.

원고 참여는 안하였고 감수로만 간간간간간접적으로 참여했습니다 :)



링크 : http://www.yes24.com/24/goods/30119802?scode=032&OzSrank=9

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

제목 그대로 텍스쳐와 모델링에 중점. 

TA 혹은 그래픽스 프로그래머라면 필수인 것 같습니다.


참여 원고 :

- 텍스쳐 압축 이해하기



링크 : http://vielbooks.com/215

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

무크지 형태의 게임 그래픽 서적

참여 원고 :

- 모바일 게임의 케릭터 라이팅을 위한 유니티 쉐이더의 최적화

- 개발자들이 알아두어야 할 VR 컨텐츠 제작의 13가지 주의 점


링크 : http://vielbooks.com/202

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

드로우콜을 중점으로 다룸



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

유니티에서 그래픽 최적화를 다룸. 유나이트와 엔디씨 버전






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

카사 스터디에서 발표했던 약 멋지게 파는 방법 ㅋ


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

유니티의 라이팅이 안 이쁘다구요? (A to Z of Lighting) 청강 게임 컨퍼런스 2014



기사 : http://www.inven.co.kr/webzine/news/?news=120362


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

KGC2013



기사 : 


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

KGC12에서 발표한 내용. 레이더즈와 건즈2에서 자체엔진 개발하면서 겪은 디퍼드 렌더링 적용 노하우


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

KGC11에서 발표한 




Posted by ozlael
,

optimize Modern GPU

My Speeches 2016. 8. 31. 13:57
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

사내(마이에트) 스터디에서 다루었던 현대 GPU에서의 최적화. 11년도 자료라 더 이상 현대가 아니지만...



Posted by ozlael
,

DOF

My Speeches 2016. 8. 31. 13:55
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

사내(마이에트) 스터디에서 다루었던 DOF. 개량한 블러도 설명



Posted by ozlael
,

SSAO

My Speeches 2016. 8. 31. 13:54
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

사내 스터디에서 다루었던 SSAO 개요



Posted by ozlael
,

Inferred lighting

My Speeches 2016. 8. 31. 13:49
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

사내 스터디에서 다루었던 Inferred lighting 자료



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

G-buffer Normal을 R16FG16F 포맷으로 사용 시 Z 부호 문제 Deferred Rendering

저희 엔진은 G-buffer Normal을 Deferred Rendering in Killzone 2에 나온 방식으로 x,y만 저장하고, 읽을 시 Normal.z = sqrt(1.0f - Normal.x제곱 - Normal.y제곱)으로 계산해냅니다.  하지만 값의 부호는 양수지요. 처음에는 뷰 스페이스 노말이므로 뒷면을 그리지 않는 한 z의 부호는 항상 음수일 것으로 생각하고 무조건 음수로 사용했었습니다만 경기도 오산이였습니다. 양수가 되는 경우도 있더군요. 카메라가 지면 가까이서 하늘을 향했 을 시 지면의 뷰 스페이스 노말 z가 양수가 되는 경우가 발생합니다. 
그래서 G-buffer Depth의 값에 뷰 스페이스 노말의 z 부호를 저장하여 해결했습니다. 어짜피 깊이 값의 부호는 항상 양수이므로 저장 값의 부호는 노말 z의 부호로 사용하면 문제 해결이지요. depth를 안읽고 normal만 읽는 경우는 없으니 추가 비용에 대한 부담도 없다고 보면 되겠지요.
티스님의 글을 보고 생각나서 몇자 적어보았습니다 :-)


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

10년도 작성 글 백업

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


디퍼드 랜더 시스템 개략( Forward, Deferred, Light Prepass, Inferred)Deferred Rendering

얼마 전 저희 엔진 랜더 시스템에 대한 간략한 리뷰를 가졌습니다. 그때 사용 된 PT 슬라이드를 올리기는 좀 거시기 하여서 그 중 올려도 상관 없는 몇 장만 살포시 올려봅니다 -ㅈ-; 대강의 디퍼드 랜더 시스템 개략 설명입니다. Forward, Deferred, Light Prepass, Inferred 시스템을 대략적으로 한장씩 표현하였습니다.


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

Compact Normal Storage for Small G-Buffers Deferred Rendering

원문 : http://aras-p.info/texts/CompactNormalStorage.html

Compact Normal Storage for Small G-Buffers

Intro

Various deferred shading/lighting approaches or image postprocessing effects need to store normals as part of their G-buffer. Let’s figure out a compact storage method for view space normals. In my case, main target is minimalist G-buffer, where depth and normals are packed into a single 32 bit (8 bits/channel) render texture. I try to minimize error and shader cycles to encode/decode.

Now of course, 8 bits/channel storage for normals can be not enough for shading, especially if you want specular (low precision & quantization leads to specular “wobble” when camera or objects move). However, everything below should Just Work (tm) for 10 or 16 bits/channel integer formats. For 16 bits/channel half-float formats, some of the computations are not necessary (e.g. bringing normal values into 0..1 range).

If you know other ways to store/encode normals, please let me know in the comments!

Various normal encoding methods and their comparison below. Notes:

  • Error images are: 1-pow(dot(n1,n2),1024) and abs(n1-n2)*30, where n1 is actual normal, and n2 is normal encoded into a texture, read back & decoded. MSE and PSNR is computed on the difference (abs(n1-n2)) image.
  • Shader code is HLSL. Compiled into ps_3_0 by d3dx9_42.dll (February 2010 SDK).
  • Radeon GPU performance numbers from AMD’s GPU ShaderAnalyzer 1.53, using Catalyst 9.12 driver.
  • GeForce GPU performance numbers from NVIDIA’s NVShaderPerf 2.0, using 174.74 driver.

Note: there was an error!

Original version of my article had some stupidity: encoding shaders did not normalize the incoming per-vertex normal. This resulted in quality evaluation results being somewhat wrong. Also, if normal is assumed to be normalized, then three methods in original article (Sphere Map, Cry Engine 3 and Lambert Azimuthal) are in fact completely equivalent. The old version is still available for the sake of integrity of the internets.

Test Playground Application

Here is a small Windows application I used to test everything below: NormalEncodingPlayground.zip(4.8MB, source included).

It requires GPU with Shader Model 3.0 support. When it writes fancy shader reports, it expects AMD’s GPUShaderAnalyzer and NVIDIA’s NVShaderPerf to be installed. Source code should build with Visual C++ 2008.

Baseline: store X&Y&Z

Just to set the basis, store all three components of the normal. It’s not suitable for our quest, but I include it here to evaluate “base” encoding error (which happens here only because of quantization to 8 bits per component).

Encoding, Error to Power, Error * 30 images below. MSE: 0.000008; PSNR: 51.081 dB.
  

EncodingDecoding
half4 encode (half3 n, float3 view){    return half4(n.xyz*0.5+0.5,0);}
half3 decode (half4 enc, float3 view){    return enc.xyz*2-1;}
ps_3_0def c0, 0.5, 0, 0, 0dcl_texcoord_pp v0.xyzmad_pp oC0, v0.xyzx, c0.xxxy, c0.xxxy
ps_3_0def c0, 2, -1, 0, 0dcl_texcoord2 v0.xydcl_2d s0texld_pp r0, v0, s0mad_pp oC0.xyz, r0, c0.x, c0.ymov_pp oC0.w, c0.z
1 ALURadeon HD 2400: 1 GPR, 1.00 clkRadeon HD 3870: 1 GPR, 1.00 clkRadeon HD 5870: 1 GPR, 0.50 clkGeForce 6200: 1 GPR, 1.00 clkGeForce 7800GT: 1 GPR, 1.00 clkGeForce 8800GTX: 6 GPR, 8.00 clk
2 ALU, 1 TEXRadeon HD 2400: 1 GPR, 1.00 clkRadeon HD 3870: 1 GPR, 1.00 clkRadeon HD 5870: 1 GPR, 0.50 clkGeForce 6200: 1 GPR, 1.00 clkGeForce 7800GT: 1 GPR, 1.00 clkGeForce 8800GTX: 6 GPR, 10.00 clk

Method #1: store X&Y, reconstruct Z

Used by Killzone 2 among others (PDF link).

Encoding, Error to Power, Error * 30 images below. MSE: 0.013514; PSNR: 18.692 dB.
  

Pros:
  • Very simple to encode/decode
Cons:
  • Normal can point away from the camera. My test scene setup actually has that. See Resistance 2 Prelighting paper (PDF link) for explanation.
EncodingDecoding
half4 encode (half3 n, float3 view){    return half4(n.xy*0.5+0.5,0,0);}
half3 decode (half2 enc, float3 view){    half3 n;    n.xy = enc*2-1;    n.z = sqrt(1-dot(n.xy, n.xy));    return n;}
ps_3_0def c0, 0.5, 0, 0, 0dcl_texcoord_pp v0.xymad_pp oC0, v0.xyxx, c0.xxyy, c0.xxyy
ps_3_0def c0, 2, -1, 1, 0dcl_texcoord2 v0.xydcl_2d s0texld_pp r0, v0, s0mad_pp r0.xy, r0, c0.x, c0.ydp2add_pp r0.z, r0, -r0, c0.zmov_pp oC0.xy, r0rsq_pp r0.x, r0.zrcp_pp oC0.z, r0.xmov_pp oC0.w, c0.w
1 ALURadeon HD 2400: 1 GPR, 1.00 clkRadeon HD 3870: 1 GPR, 1.00 clkRadeon HD 5870: 1 GPR, 0.50 clkGeForce 6200: 1 GPR, 1.00 clkGeForce 7800GT: 1 GPR, 1.00 clkGeForce 8800GTX: 5 GPR, 7.00 clk
7 ALU, 1 TEXRadeon HD 2400: 1 GPR, 1.00 clkRadeon HD 3870: 1 GPR, 1.00 clkRadeon HD 5870: 1 GPR, 0.50 clkGeForce 6200: 1 GPR, 4.00 clkGeForce 7800GT: 1 GPR, 3.00 clkGeForce 8800GTX: 5 GPR, 15.00 clk

Method #3: Spherical Coordinates

It is possible to use spherical coordinates to encode the normal. Since we know it’s unit length, we can just store the two angles.

Suggested by Pat Wilson of Garage Games: GG blog post. Other mentions: MJP’s blogGarageGames threadWolf Engel’s bloggamedev.net forum thread.

Encoding, Error to Power, Error * 30 images below. MSE: 0.000062; PSNR: 42.042 dB.
  

Pros:
  • Suitable for normals in general (not necessarily view space)
Cons:
  • Uses trig instructions (quite heavy on ALU). Possible to replace some of that with texture lookups though.
EncodingDecoding
#define kPI 3.1415926536fhalf4 encode (half3 n, float3 view){    return half4(      (half2(atan2(n.y,n.x)/kPI, n.z)+1.0)*0.5,      0,0);}
half3 decode (half2 enc, float3 view){    half2 ang = enc*2-1;    half2 scth;    sincos(ang.x * kPI, scth.x, scth.y);    half2 scphi = half2(sqrt(1.0 - ang.y*ang.y), ang.y);    return half3(scth.y*scphi.x, scth.x*scphi.x, scphi.y);}
ps_3_0def c0, 0.999866009, 0, 1, 3.14159274def c1, 0.0208350997, -0.0851330012,    0.180141002, -0.330299497def c2, -2, 1.57079637, 0.318309873, 0.5dcl_texcoord_pp v0.xyzadd_pp r0.xy, -v0_abs, v0_abs.yxzwcmp_pp r0.xz, r0.x, v0_abs.xyyw, v0_abs.yyxwcmp_pp r0.y, r0.y, c0.y, c0.zrcp_pp r0.z, r0.zmul_pp r0.x, r0.x, r0.zmul_pp r0.z, r0.x, r0.xmad_pp r0.w, r0.z, c1.x, c1.ymad_pp r0.w, r0.z, r0.w, c1.zmad_pp r0.w, r0.z, r0.w, c1.wmad_pp r0.z, r0.z, r0.w, c0.xmul_pp r0.x, r0.x, r0.zmad_pp r0.z, r0.x, c2.x, c2.ymad_pp r0.x, r0.z, r0.y, r0.xcmp_pp r0.y, v0.x, -c0.y, -c0.wadd_pp r0.x, r0.x, r0.yadd_pp r0.y, r0.x, r0.xadd_pp r0.z, -v0.x, v0.ycmp_pp r0.zw, r0.z, v0.xyxy, v0.xyyxcmp_pp r0.zw, r0, c0.xyyz, c0.xyzymul_pp r0.z, r0.w, r0.zmad_pp r0.x, r0.z, -r0.y, r0.xmul_pp r0.x, r0.x, c2.zmov_pp r0.y, v0.zadd_pp r0.xy, r0, c0.zmul_pp oC0.xy, r0, c2.wmov_pp oC0.zw, c0.y
ps_3_0def c0, 2, -1, 0.5, 1def c1, 6.28318548, -3.14159274, 1, 0dcl_texcoord2 v0.xydcl_2d s0texld_pp r0, v0, s0mad_pp r0.xy, r0, c0.x, c0.ymad r0.x, r0.x, c0.z, c0.zfrc r0.x, r0.xmad r0.x, r0.x, c1.x, c1.ysincos_pp r1.xy, r0.xmad_pp r0.x, r0.y, -r0.y, c0.wmul_pp oC0.zw, r0.y, c1rsq_pp r0.x, r0.xrcp_pp r0.x, r0.xmul_pp oC0.xy, r1, r0.x
26 ALURadeon HD 2400: 1 GPR, 17.00 clkRadeon HD 3870: 1 GPR, 4.25 clkRadeon HD 5870: 2 GPR, 0.95 clkGeForce 6200: 2 GPR, 12.00 clkGeForce 7800GT: 2 GPR, 9.00 clkGeForce 8800GTX: 9 GPR, 43.00 clk
17 ALU, 1 TEXRadeon HD 2400: 1 GPR, 17.00 clkRadeon HD 3870: 1 GPR, 4.25 clkRadeon HD 5870: 2 GPR, 0.95 clkGeForce 6200: 2 GPR, 7.00 clkGeForce 7800GT: 1 GPR, 5.00 clkGeForce 8800GTX: 6 GPR, 23.00 clk

Method #4: Spheremap Transform

Spherical environment mapping (indirectly) maps reflection vector to a texture coordinate in [0..1] range. The reflection vector can point away from the camera, just like our view space normals. Bingo! See Siggraph 99 notes for sphere map math. Normal we want to encode is R, resulting values are (s,t).

If we assume that incoming normal is normalized, then there are methods derived from elsewhere that end up being exactly equivalent:

  • Used in Cry Engine 3, presented by Martin Mittring in “A bit more Deferred” presentation (PPT link, slide 13). For Unity, I had to negate Z component of view space normal to produce good results, I guess Unity’s and Cry Engine’s coordinate systems are different. The code would be:
    half2 encode (half3 n, float3 view){    half2 enc = normalize(n.xy) * (sqrt(-n.z*0.5+0.5));    enc = enc*0.5+0.5;    return enc;}half3 decode (half4 enc, float3 view){    half4 nn = enc*half4(2,2,0,0) + half4(-1,-1,1,-1);    half l = dot(nn.xyz,-nn.xyw);    nn.z = l;    nn.xy *= sqrt(l);    return nn.xyz * 2 + half3(0,0,-1);}
  • Lambert Azimuthal Equal-Area projection (Wikipedia link). Suggested by Sean Barrett in commentsfor this article. The code would be:
    half2 encode (half3 n, float3 view){    half f = sqrt(8*n.z+8);    return n.xy / f + 0.5;}half3 decode (half4 enc, float3 view){    half2 fenc = enc*4-2;    half f = dot(fenc,fenc);    half g = sqrt(1-f/4);    half3 n;    n.xy = fenc*g;    n.z = 1-f/2;    return n;}

Encoding, Error to Power, Error * 30 images below. MSE: 0.000016; PSNR: 48.071 dB.
  

Pros:
  • Quality pretty good!
  • Quite cheap to encode/decode.
  • Similar derivation used by Cry Engine 3, so it must be good :)
Cons:
  • ???
EncodingDecoding
half4 encode (half3 n, float3 view){    half p = sqrt(n.z*8+8);    return half4(n.xy/p + 0.5,0,0);}
half3 decode (half2 enc, float3 view){    half2 fenc = enc*4-2;    half f = dot(fenc,fenc);    half g = sqrt(1-f/4);    half3 n;    n.xy = fenc*g;    n.z = 1-f/2;    return n;}
ps_3_0def c0, 8, 0.5, 0, 0dcl_texcoord_pp v0.xyzmad_pp r0.x, v0.z, c0.x, c0.xrsq_pp r0.x, r0.xmad_pp oC0.xy, v0, r0.x, c0.ymov_pp oC0.zw, c0.z
ps_3_0def c0, 4, -2, 0, 1def c1, 0.25, 0.5, 1, 0dcl_texcoord2 v0.xydcl_2d s0texld_pp r0, v0, s0mad_pp r0.xy, r0, c0.x, c0.ydp2add_pp r0.z, r0, r0, c0.zmad_pp r0.zw, r0.z, -c1.xyxy, c1.zrsq_pp r0.z, r0.zmul_pp oC0.zw, r0.w, c0.xywzrcp_pp r0.z, r0.zmul_pp oC0.xy, r0, r0.z
4 ALURadeon HD 2400: 2 GPR, 3.00 clkRadeon HD 3870: 2 GPR, 1.00 clkRadeon HD 5870: 2 GPR, 0.50 clkGeForce 6200: 1 GPR, 4.00 clkGeForce 7800GT: 1 GPR, 2.00 clkGeForce 8800GTX: 5 GPR, 12.00 clk
8 ALU, 1 TEXRadeon HD 2400: 2 GPR, 3.00 clkRadeon HD 3870: 2 GPR, 1.00 clkRadeon HD 5870: 2 GPR, 0.50 clkGeForce 6200: 1 GPR, 6.00 clkGeForce 7800GT: 1 GPR, 3.00 clkGeForce 8800GTX: 6 GPR, 15.00 clk

Method #7: Stereographic Projection

What the title says: use Stereographic Projection (Wikipedia link), plus rescaling so that “practically visible” range of normals maps into unit circle (regular stereographic projection maps sphere to circle of infinite size). In my tests, scaling factor of 1.7777 produced best results; in practice it depends on FOV used and how much do you care about normals that point away from the camera.

Suggested by Sean Barrett and Ignacio Castano in comments for this article.

Encoding, Error to Power, Error * 30 images below. MSE: 0.000038; PSNR: 44.147 dB.
  

Pros:
  • Quality pretty good!
  • Quite cheap to encode/decode.
Cons:
  • ???
EncodingDecoding
half4 encode (half3 n, float3 view){    half scale = 1.7777;    half2 enc = n.xy / (n.z+1);    enc /= scale;    enc = enc*0.5+0.5;    return half4(enc,0,0);}
half3 decode (half4 enc, float3 view){    half scale = 1.7777;    half3 nn =        enc.xyz*half3(2*scale,2*scale,0) +        half3(-scale,-scale,1);    half g = 2.0 / dot(nn.xyz,nn.xyz);    half3 n;    n.xy = g*nn.xy;    n.z = g-1;    return n;}
ps_3_0def c0, 1, 0.281262308, 0.5, 0dcl_texcoord_pp v0.xyzadd_pp r0.x, c0.x, v0.zrcp r0.x, r0.xmul_pp r0.xy, r0.x, v0mad_pp oC0.xy, r0, c0.y, c0.zmov_pp oC0.zw, c0.w
ps_3_0def c0, 3.55539989, 0, -1.77769995, 1def c1, 2, -1, 0, 0dcl_texcoord2 v0.xydcl_2d s0texld_pp r0, v0, s0mad_pp r0.xyz, r0, c0.xxyw, c0.zzwwdp3_pp r0.z, r0, r0rcp r0.z, r0.zadd_pp r0.w, r0.z, r0.zmad_pp oC0.z, r0.z, c1.x, c1.ymul_pp oC0.xy, r0, r0.wmov_pp oC0.w, c0.y
5 ALURadeon HD 2400: 2 GPR, 4.00 clkRadeon HD 3870: 2 GPR, 1.00 clkRadeon HD 5870: 2 GPR, 0.50 clkGeForce 6200: 1 GPR, 2.00 clkGeForce 7800GT: 1 GPR, 2.00 clkGeForce 8800GTX: 5 GPR, 12.00 clk
7 ALU, 1 TEXRadeon HD 2400: 2 GPR, 4.00 clkRadeon HD 3870: 2 GPR, 1.00 clkRadeon HD 5870: 2 GPR, 0.50 clkGeForce 6200: 1 GPR, 4.00 clkGeForce 7800GT: 1 GPR, 4.00 clkGeForce 8800GTX: 6 GPR, 12.00 clk

Method #8: Per-pixel View Space

If we compute view space per-pixel, then Z component of a normal can never be negative. Then just store X&Y, and compute Z.

Suggested by Yuriy O’Donnell on Twitter.

Encoding, Error to Power, Error * 30 images below. MSE: 0.000134; PSNR: 38.730 dB.
  

Pros:
  • ???
Cons:
  • Quite heavy on ALU
EncodingDecoding
float3x3 make_view_mat (float3 view){    view = normalize(view);    float3 x,y,z;    z = -view;    x = normalize (float3(z.z, 0, -z.x));    y = cross (z,x);    return float3x3 (x,y,z);}half4 encode (half3 n, float3 view){    return half4(mul (make_view_mat(view), n).xy*0.5+0.5,0,0);}half3 decode (half4 enc, float3 view){    half3 n;    n.xy = enc*2-1;    n.z = sqrt(1+dot(n.xy,-n.xy));    n = mul(n, make_view_mat(view));    return n;}
ps_3_0def c0, 1, -1, 0, 0.5dcl_texcoord_pp v0.xyzdcl_texcoord1 v1.xyzmov r0.x, c0.znrm r1.xyz, v1mov r1.w, -r1.zmul r0.yz, r1.xxzw, c0.xxywdp2add r0.w, r1.wxzw, r0.zyzw, c0.zrsq r0.w, r0.wmul r0.xyz, r0, r0.wmul r2.xyz, -r1.zxyw, r0mad r1.xyz, -r1.yzxw, r0.yzxw, -r2dp2add r0.x, r0.zyzw, v0.xzzw, c0.zdp3 r0.y, r1, v0mad_pp oC0.xy, r0, c0.w, c0.wmov_pp oC0.zw, c0.z
ps_3_0def c0, 2, -1, 1, 0dcl_texcoord1 v0.xyzdcl_texcoord2 v1.xydcl_2d s0mov r0.y, c0.wnrm r1.xyz, v0mov r1.w, -r1.zmul r0.xz, r1.zyxw, c0.yyzwdp2add r0.w, r1.wxzw, r0.xzzw, c0.wrsq r0.w, r0.wmul r0.xyz, r0, r0.wmul r2.xyz, -r1.zxyw, r0.yzxwmad r2.xyz, -r1.yzxw, r0.zxyw, -r2texld_pp r3, v1, s0mad_pp r3.xy, r3, c0.x, c0.ymul r2.xyz, r2, r3.ymad r0.xyz, r3.x, r0, r2dp2add_pp r0.w, r3, -r3, c0.zrsq_pp r0.w, r0.wrcp_pp r0.w, r0.wmad_pp oC0.xyz, r0.w, -r1, r0mov_pp oC0.w, c0.w
17 ALURadeon HD 2400: 3 GPR, 11.00 clkRadeon HD 3870: 3 GPR, 2.75 clkRadeon HD 5870: 2 GPR, 0.80 clkGeForce 6200: 4 GPR, 12.00 clkGeForce 7800GT: 4 GPR, 8.00 clkGeForce 8800GTX: 8 GPR, 24.00 clk
21 ALU, 1 TEXRadeon HD 2400: 3 GPR, 11.00 clkRadeon HD 3870: 3 GPR, 2.75 clkRadeon HD 5870: 2 GPR, 0.80 clkGeForce 6200: 3 GPR, 12.00 clkGeForce 7800GT: 3 GPR, 9.00 clkGeForce 8800GTX: 12 GPR, 29.00 clk

Performance Comparison

GPU performance comparison in a single table:

#1: X & Y#3: Spherical#4: Spheremap#7: Stereo#8: PPView
Encoding, GPU cycles
Radeon HD24001.0017.003.004.0011.00
Radeon HD58700.500.950.500.500.80
GeForce 62001.0012.004.002.0012.00
GeForce 88007.0043.0012.0012.0024.00
Decoding, GPU cycles
Radeon HD24001.0017.003.004.0011.00
Radeon HD58700.500.950.501.000.80
GeForce 62004.007.006.004.0012.00
GeForce 880015.0023.0015.0012.0029.00
Encoding, D3D ALU+TEX instruction slots
SM3.01264517
Decoding, D3D ALU+TEX instruction slots
SM3.08189822

Quality Comparison

Quality comparison in a single table. PSNR based, higher numbers are better.

MethodPSNR, dB
#1: X & Y18.629
#3: Spherical42.042
#4: Spheremap48.071
#7: Stereographic44.147
#8: Per pixel view38.730


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

이 글은 10년도 글 백업임

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


shader constant array를 이용한 Mesh Instancing Game develop

이번엔 인스턴싱에 대해 이야기 해보고자 한다. instancing에 대한 정의 및 정리는 다른 분들이 잘 해주신 것들이 많기에 괜히 내가 어설프게 따로 정리하지는 않는다. 다만 내가 사용 한 조금 다른 방식을 소개하고 조언을 구하고자 한다. 우선 인스턴싱에 대하여 잘 모르시는 분은 다음 링크들을 살펴보면 되겠다.

: 이 글 내에도 더 많은 인스턴싱 뿐 아닌 Batching 관련 용한 링크들이 있다.
: XNA 기준으로 작성이 되어 있지만 함수 프로퍼티만 다를 뿐, 개념 및 설명은 정말 잘 되어 있다.
: DX10 기준으로 설명이 되어 있다. VS에서의 텍스쳐 읽기(VTF)는 Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술에도 응용하고 있다.
http://zeuxcg.blogspot.com/2007/09/particle-rendering-revisited.html
: 파티클에 instancing을 응용하는 방법이 설명되어 있다. 여기서 버텍스의 위치를 정하는 방법은 SpeedTree, SpeedGrass등에서도 쓰이는 방법과 비슷하다.

최근의 대중화된 그래픽카드들은 웬만하면 Shader Model 3.0이상을 지원하므로, 우리 엔진도  secone Vertex Buffer를 사용하는 Hardware Instancing를 이용한다. 
그러기 위해서는 매번 second Vertex Buffer에 대하여 lock/unlock를 수행해야 한다. 나는 buffer lock없이도 오브젝트들을 transform 시키고 컬링에서 걸러질 수 있을 지 고민하다 셰이더 상수 배열을 이용하기로 했다. 위 링크에 나온 방식에서 특별히 크게 다른 것도 아니고, 쉽게 생각 할 수 있는 방식이라 이미 누군가 사용하다 버린(내가 생각했던 것 보다 효울이 그렇게 좋지는 않았기 때문에) 것일 지도 모르겠다.
 - second Vertex Buffer의 자료형은 오로지 float하나만으로 이루어져 있다. 
 - 한번에 수용 가능한 인스턴스의 갯수만큼의 크기 n의 크기로 버퍼를 생성하고, 0,1,2~(n-1)로 채운다. 이 숫자들은 변경될 일이 없으며, 상수 배열의 인덱스로 쓰인다.
 - 셰이더에서는 인스턴스의 트랜스폼을 결정 할 매트릭스 배열 m[n]을 선언한다. 
 - 오브젝트의 위치 변화가 있을떄 혹은 매 프레임마다 인스턴스들의 world matrix들을 m에 셋팅해준다.
 - VS에서는 second stream의 내용을 m[]의 인덱스 첨자로 사용하여 world matrix를 결정하고 transform한다.

이렇게 되면 Vertex Buffer의 실시간 Lock/Unlock비용에서 해방될 수 있다. 
하지만 단점으로는, 
 - 1. 상수 갯수의 제한이 있다보니 한번에 100단위의 갯수를 그려내지 못한다. 이것 저것 따지다보면 기껏 해봐야 3,40개 정도가 수용 가능하다. 하지만, 실제 게임에서 랜더링 하다보면 같은 메쉬를 그 이상 그려낼 일이 많이 없다. 100단위 혹은 1000단위로 그려내는 것은 테스트 컷 외에는 발생하지 않으므로, 이 단점이 큰제약이 되지는 않는다.
 - 2. matrix array를 셰이더로 넘겨주는 것이 생각보다는 무겁다. VB lock보다는 낫긴 하지만 생각보다 드라마틱한 효과는 보지 못했다.
 - 3. 실제 그리려는 인스턴스의 갯수와는 상관 없이 m[n]의 크기에 따라  SetMatrixarray()를 통한 상수 설정 시간이 결정된다. SetMatrixarray(,,1)을 하든 SetMatrixarray(,,40)을 하든 상관 없이 n에 따라 비례한다. 이를 극복할 수 있는 방법이 있으면 조언을 부탁드린다.

만약 우리 게임이 작은 우주선이 2,300개씩 나오는 RTS라면 이 방식이 쓰이지 못할 것이다. 하지만 우리 엔진에는 꽤 적합한 방식이라 생각하고 있다. 작업 양이 그리 크지도 않으므로 이런 방식으로도 한번 시도해보시길 바란다. 작업시 문제점과 개선점도 공유해주시고말이다~ 굽신~굽신~ 


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

이 글은 2010년도 작성 된 글임. 현재는 더 많은 SSAO 기법들이 있으므로 최신 자료들도 찾아보셈

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


SSAO (Screen Space Ambient Occlusion) 링크 모음 Game develop


AO(Ambient Occlusion)는 사실적인 그림자 효과 라이팅의 방법 중 하나로써, 전역 조명 과정에서 한 점의 차폐 양을 계산 하는 것을 나타낸다. 이로써 장면 내의 입체 볼륨감을 더욱 부각시킬 수 있다. SSAO는 이를 Screen Space에서 수행하는 것이다. HBAO, SSDO등도 이와 한 뿌리다. 

실제 적용 해보면 제일 애를 먹는 것이 half-resolution에서 AO 처리를 한 뒤 upscale을 하는 부분인데, 이는 inferred lighting의 DSF필터를 적용 하면 쉽게 해결 될 듯 하다.( DSF 적용 해보진 않음;; 언능 해봐야집)


하지만 지글지글 문제는 해결이 안되지 싶은데.. 이놈때문에 엔진 디폴트로 AO는 꺼트린 상태다. 섬바뤼헬미~

관련 링크 (문서 내 링크 중복도 많이 있다 =ㅈ=):
http://kyruie.tistory.com/31 (한글)
http://www.eppengine.com/zbxe/programmig/2982 (한글)
http://www.gamedev.net/community/forums/topic.asp?topic_id=545825
http://en.wikipedia.org/wiki/Screen_Space_Ambient_Occlusion
http://www.gamedev.net/community/forums/topic.asp?topic_id=545825
http://developer.amd.com/gpu_assets/S2008-Filion-McNaughton-StarCraftII.pdf
http://www.gamerendering.com/2009/01/14/ssao/
http://www.gamedev.net/community/forums/topic.asp?topic_id=550699
http://www.vizerie3d.net/
http://developer.download.nvidia.com/presentations/2008/SIGGRAPH/HBAO_SIG08b.pdf
http://developer.download.nvidia.com/presentations/2008/GDC/GDC08_Ambient_Occlusion.pdf
http://developer.download.nvidia.com/SDK/10.5/direct3d/Source/ScreenSpaceAO/doc/ScreenSpaceAO.pdf
http://gamepro.tistory.com/539
http://www.gamedev.net/reference/programming/features/simpleSSAO/


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

이 글은 10년도에 작성 된 글 백업임. 망할 이글루스

0-------------------------------------------------------



[번역] Two-part shadow maps :wolfire ( AO와 Shadow map) Game develop

앰비언트 오클루전은 게임 그래픽에서 입체감을 부여하기 위해 자주 쓰이게 된다. 대부분 Screen-space AO(SSAO링크 모음)를 주로 사용하고 우리 엔진 역시 이를 사용한다. 하지만 하드웨어 요구사항 및 아티스트의 제어 난해함으로 인해 SSAO가 아닌 방법을 사용하는 사례도 눈에 띄곤 한다.( 대표적으로 스프린터 셀 : GDC2010 : Hill Stephen Rendering Tools Splinter Cell Conviction)

회사 동료를 통해 그러한 사례를 하나 더 발견하게 되어 소개해드리고자 한다. OverGrowth란 게임에서 쓰인 방식인데, 반구로부터 64방향으로 그림자를 만들어 AO를 생성한다. 기왕 소개하는 김에 본인과 같이 나랏말쏘미 미쿡에 달아 서로 사맛디 아니할쌔 이런 전차로 미쿸말을 싫어하는 분을 위해 번역하여 올린다. 발로 번역하였으므로 미쿸말과 친한 분이라면 정신 건강을 위해 원문을 읽는 것을 권장한다.

이번 이글루스 권한 오류 대란에도 아무 피해를 입지 않은, 아무도 찾지않는 바람부는 언덕의 잡초 블로그지만, 혹시나 이 글을 퍼가도 되나 망설이시는 분이 있다면 마음놓고 퍼가셔도 된다. 어짜피 나도 포스트 작성자 허가 없이 가져와서 번역한거다.

원문 : Two-part shadow maps By David Rosen on March 17th, 2010

Two-part shadow maps

 

Overgrowth에서 쓰인 shadow map은 두가지 파트(direct shadows와  ambient occlusion)를 포함하는 일반적이지 않은 방법을 사용 한다. 이는 야외 씬의 하늘과 태양 두가지 라이트 소스에 해당한다. 사막에 집이 있는 다음 씬을 가지고 이 방식이 어떻게 작동하는지를 설명하겠다.

쉐도우 맵의 첫번째 파트는 direct shadows로 이루어져있다. 우리는 씬을 그리드로 나누어 계산하고 고정밀 뎁스 맵 쉐도우로 축적한다. 이는 매우 높은 연산 속도를 위해서 그래픽카드에서 완료된다. 다음 그림은 이 씬의 direct shadows를 나타낸다.

shadow map의 두번째 파트는 ambient occlusion(스카이 반구로 부터 얼마나 많은 빛이 도달하는 가에 대한)이다. 이는 하늘 반구의 64 포인트로부터의 direct shadows를 누적함으로써 계산된다. 다음 그림은 이 씬의 ambient occlusion을 나타낸다.

두 shadow map을 나누어서 저장할 수 있지만, 효과적으로 하기 위해서는 그 둘을 하나의 shadow map에 섞을 수 있다. 그래픽 카드는 이미지를 3개의 컬러 채널(RGB)로 저장하므로 우리는 direct shadows를 red 채널에, ambient occlusion을 green 채널에 저장할 수 있다.다음 그림은 direct shadows, ambient occlusion, 두 파트를 섞은 shadow map을 각각 나타낸다.

그림자 처리된 라이팅을 적용하기 위해서는, 우리는 direct shadows에 의한 direct 라이트와 ambient occlusion에 의한 ambient 라이트를 조절하면 하면 된다. 그다음에 direct와 ambient가 조절된 라이팅을 각각의 픽셀의 최종 라이팅에 더한다. 다음 그림에서 조절된 direct 라이팅과 조절된 ambient 라이팅과 합성된 최종 라이팅을 볼 수 있다.

이제 라이팅을 컬러맵과 합성해야하여 최종 이미지를 얻게 된다. 다음 그림에서 합산 라이팅, 컬러맵, 그리고 최종 이미지를 볼 수 있다.

최근 이 포스트에서 왜 ambient occlusion이 케릭터에게 중요한지를 상의했다. 그리고 같은 이유로 환경에도 중요하다( 공간을 정의하고 그림자 영역에 깊이를 더해주는 것을 도와준다). 좌측에 ambient occlusion이 없는 이미지와 우측에 ambient occlusion이 있는 이미지를 아래에 비교해놓았다. 구석 공간을 어떻게 정의하는 것을 도와주는지를 확인하기 위해서 어닝(차양지붕) 아래와 나무 통로를 살펴보면 된다.

많은 게임이 cascading shadow maps, screen-space 깊이 비교( 역주: SSAO를 가리키는 듯), deferred light 누적을 이용하여 직접광원과 간접광원의 근사치를 낸다. 이 텍크닉들은 강력하고 사용하기에 재밌지만 그것들의 결과물들과 하드웨어는 요구사항은 Overgrowth에는 적합하지 않다. 우리는 효과적이고 정확한 구워진  shadow map을 만드는 것이 더 나은 선택이다. 


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

[번역] Environment shadows - step 4 By David Rosen on April 10th, 2009 Game develop

이 글 역시 앰비언트 오클루전의 필요성에 대해 간단하면서도 와닿게 설명 하는 글인 것 같아 소개한다. 이 양반들 개발 과정 중 포스팅을 작성 하는게 매우 인상깊어 보인다. 

원문 : http://blog.wolfire.com/2009/04/environment-shadows-step-4/

Environment shadows - step 4
By David Rosen on April 10th, 2009

최근에 ambient occlusion을 lightmap으로 구워놓는 작업을 시작했다. 이는 현재 하늘로부터 랜덤한 64개의 라이트 소스를 통한 그림자를 누적시켜서 구현된다. 그리고 ambient occlusion의 결과 map을 간접광에 곱한다. ambient occlusion이 있는(위) 것과 없는(아래) Foothold map이 요기잉네: 

Shadow image

Shadow image

이는 매우 민감한 효과지만, 이러첨 복잡한 씬의 공간적 관계를 알기 쉽게 만들어 준다 생각한다. ambient occlusion map이 요기잉네:

Shadow image

이 그림은 간접광 그림자가 왜 중요한지를 나타낸다. 직접적인 태양광이 없더라도, 터널과 내부 영역은 야외 영역보다 다소 어두워야 한다.

Shadow image


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

이 글은 10년도 글 백업임

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


망할 SSAO halo 현상 !!! Game develop

siggraph 2010 문서 링크에 있는 문서 중 "Rendering techniques in Toy Story 3"를 이제야 보게 되었습니다. Toy Story라길래 CG이야기인줄알고 천천히 보려 했는데, 알고보니 게임이더군요 -ㅈ- 게임의 존재를 에니메이션을 보고 엔딩 크레딧 올라갈때 알았습니다;; 

우선춫현: PowerPoint Slides (121 MB),  PDF Slides (16.8 MB), Video (21 MB)

SSAO를 포함해서 라이팅 및 그림자에 대한 이야기를 하고 있군요. 대박 문서입니다. 이걸 왜 이제야 봤을까 싶네요. 근데 보면서 느낀거는... AO와 오브젝트 경계 사이의 미세한 halo는 아무도 신경을 쓰지 않는다는 겁니다. 
언차티드도 그러고 토이 스토리도 그러고 크라이시스도 그러고... 다들 완전히 없애지 않네요. 그동안 그거 없애려고 얼마나 많은 삽질을 했는데 다들 걍 냅두네요. 아마 별수 없나봐요.
 픽사도 못하는데 아마 난 안될거야 OTL

작업자 눈에만 보이는 현상인가봐요. 회사 동료분들도 아무도 안거슬린다더군요. 난 거슬리는데;; 하지만 픽사도 별수 없으니 나도 깔끔하게 포기하렵니다. ( 이미지를 그림판에서 jpg로 저장하다보니 뭉개져서 티가 잘 안나네요. 원본을 보셔요)

제가 표시해놓은 부분 거슬리시는 분 손~! 
저요 저요 저요 !

혹시 SSAO halo때문에 고민하시는 분들 bilateral이니 depth bais니 filter따위 포기하시고 마음 푸셔요.

안생겨요 -> 무조건 생겨요


Posted by ozlael
,
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
,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이 글은 11년도에 작성한 글 중 NDC 후기 백업들임

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



NDC11 전역조명 세션 대충 후기

슬라이드 사진은 접어놓은거 펼쳐서 보시구요
자세한 설명은 ndc2011 전역 조명의 기본 이론 에 있으므로 생략 ㅋ






한마디로

월드 머신 킹왕짱

+
덕중의 덕은 양덕

역시 사진 많아서 접어놓습니다.
파트 1 세션은 사진 촬영에 제약이 없었으나 2,3 세션은 촬영이 허가되지 않아서 사진 없음돠 +ㅈ+

 




NDC11 게임 관련 법령 리뷰 세션 후기 "게임 코드가 법의 꿈을 꾸는가, 법이 게임 코드의 꿈을 꾸는가" Game develop

요즘 신데렐라 법 덕분에 관련 법에 관심이 쵸큼 생겨서 듣고싶던 세션중 하나였습니다. 강연장 들어가서 카메라 설치라고 타이틀 한방 찍으니 안내 요원이 오셔서 촬영 금지 세션이라더군요. 찍은 타이틀 사진 항방 아까워서 올립니다 안올리는게 좋겠네요ㅎ 타이틀 작명 센스가 아우~ 쩔어요. 뭔가 있어보이지 않습니까? 넥슨 아저씨들이 작명 센스는 좋은 것 같아요. :-)

게임 코드가 법의 꿈을 꾸는가, 법이 게임 코드의 꿈을 꾸는가

이 세션은 특이하게 일반적인 슬라이드 진행 방식이 아닌 토론 형식의 세션이였습니다. 안철수님과 박경철님의 대담 형식의 강연으로 인해 요즘 트렌드인 걸까요? ㅎ 근데 그 두분의 대담보다는 공격적인 토론이랄까? 그러면서도 100분토론(빠드득)의 딱딱한 분위기가 아니라 정말 시간 가는 줄 모르고 경청했습니다.
이홍우님, 김관중님, 이원님, 세 분이 발표를 하셨는데요, 각각 유저, 개발자, 정부?법무사? 의 역할을 맡아서 토론하는 식의 진행이였습니다. 물론 세 분 다 실제로는 법 관련이시구요. 이원님은 법무실 파트는 아니지만 법대 출신이시더군요.

촬영이 금지되서 받아적으려니 엄지손가락 빠지는 줄 알았습니다. 근데 엉망으로 작성해서 엉망으로 올립니다 -ㅈ-;;


위치정보보호법  

GPS 정보 이용 어플 인기
앱 제작사 입건
사유 : 신고않고위치기반서비스  
방통위신고   
당사자는 법률존재몰라. 신고 여부 자체 모름.
제작 제약 없음. 주의필요.

심의

사실상의 검열인가?
헌법은 사전 검열 금지 
검열 정의 : 행정권, 사상의결, 발표전, 강제
내용 : 해당 
사전검열 : 해당 
행정기관 : 해당
강제 수단 : 해당없음
법적으로는 위헌 아님
심의제도강화계기 : 바다이야기 

특허

진가 가상화폐 특허 신청
게임업에 상식화된 기믹을 특허화. 
비지니스 모델 특허 : 영업 방법 특허. 전자상거례 금융등 단순 영업은 아닌 컴퓨터 기술 융합 필요
특허 성립 조건 : 산업성. 신규성. 진보성.  
특허 순서 : 아이디어 -> 출원 -> 심사공개 -> 의견제출통지 -> 등록
진가는 특허권 행사 목적 아닐 껄? 방어적차원. 특허괴물화. 온라인 게임사들의 공동 대응 필요

현거래

웹젠, 게임 아이템 중개 금지 소송
게임 업체 영업 방해.  근거 : 공정거래위원회 유권 해석
서울지법 소송 기각
시간-돈 이론  시간 많은 청소년들이 시간 없는 직장인들에게 아이템판매 
게임사는 아이템가치비인정
사기 복구 환불  환금성인정시범죄연결 사행성
게임 내 경제를 외부적 요인에 맡기게 됨
약관에 명시 아이템은대여물 

법은 아이템 거래 판단을?
시각 1. 게임 내 아이템은 사용자 재산 
물권 배타적독점권 법으로 정한 경우만
시각 2. 게임 내 아이템은 회사 재산
채권양도. 사용자에게는 사용권만 부여
약정에 의해 양도 금지 채권 만든 셈

대한민국은 물권법정주의 
아이템현거래
약관비인정  법으로비인정  기묘한동반자관계
아이템 중개 사이트는 청소년 유해물 (대법원확정판결 2010.10.)

셧다운제

2004년부터 지속적인 시도. 현재 온라인 게임만 대상.

반대의견 
유해성증명필요. 가정문제. 몽니. 자부심 지원없이자립 

실효성문제
주민번호로가입. 온라인이아닌중독성은? 외국게임규제문제 fta 

가입 시 이메일 인증 시스템 셧다운 법 법적으로 회피 불가 & 목적 아님
셧다운 미 적용 대상을 스마트폰에서 태블릿PC로 확장  경계가 딱히 법령화 되어 있지 않은 것이다 보니 역시 부처간 협의


KeSPA vs 블리자드

분쟁의주체 갈등의대상 게임리그의방송권 블리자드와의협의없이 중계권 판매
블라자드 케스파협상시도 무시
블라자드 곰티비 방송라이선스 체결 
케스파 입장 : 스타는 수 많은 게임 중 하나. 리그를 만든 건 케스파.
케스파 곰 티비 보이콧 -> fail
곰티비 스타 리그 진행 -> fail
블라자드 법 분쟁 -> fail
저작권. 저작인접권.
1차저작물 vs 2차저작물.  저작권법은 1차 인정
게임이 만든 리플레이가 영상 저작물이 되는가
결국 케스파와블리자드 라이선스계약.  
저작권 법 자체가 사회 변화를 못 따라감.
앞으로 1차 vs 2차 . 게임기업 vs 동인회사.


귀챦은 질문 친절히 대답 해주셔서 감사합니다 ㅋ


Posted by ozlael
,