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
,