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
,