hwi's laboratory  
Front Page
Tag | Location | Media | Guestbook | Admin   
 
motion blur

사용자 삽입 이미지


모션 블러 없음
 

사용자 삽입 이미지


모션 블러 적용


1. motion blur with skinning
모션 블러에서 스키닝을 적용하기 위해서는 2배의 bone 개수가 필요하다.
한 캐릭터의 본이 70개라면 총 140개의 본이 필요한데, 이 정도의 bone 개수는 bone을 translation(3개의 float)과 quaternion으로 표현된 rotation(4개의 float)으로 한다해도 256개의 상수가 넘어간다.

해결1 - software skinning으로 스키닝을 계산하고 streamsource의 0번에 현재 vertex, 1번에 이전 vertex를 넣어주는 방식으로 해결

해결2 - 일정한 bone개수가 넘어가면 mesh를 나눈다. 이렇게 하기 위해서는 mesh와 bone을 일치시키기 위한 bone index의 table이 필요하다.

해결3 - vertex texture fetch를 이용.
texture에 행렬 정보를 넣는다. bone을 매우 많이 넣을 수  있다.

해결4 - 단순히 캐릭터에 적용되는 bone개수를 줄인다. 이벤트용은 bone을 많이 사용하고 그렇지 않으면 더 단순한 모델을 사용한다.

여기서는 vertex texture fetch를 사용해서 해결해보았다.
64x64 크기의 D3DFMT_A32B32G32R32F 텍스쳐 한장을 만들고, 이곳에 skinning matrix를 넣었다.

matrix를 얻어올 떄는 아래와 같이 얻어왔다.
float4x4 GetSkinMatrix(int idx)
{
 float4 uvCol = float4(((float)((idx % 16) * 4) + 0.5f) / 64.0f, ((float)((idx / 16)) + 0.5f) / 64.0f, 0.0f, 0.0f);
 
 float4x4 mat =
 {
  tex2Dlod(sampSkin, uvCol),
  tex2Dlod(sampSkin, uvCol + float4(1.0f / 64.0f, 0, 0, 0)),
  tex2Dlod(sampSkin, uvCol + float4(2.0f / 64.0f, 0, 0, 0)),
  tex2Dlod(sampSkin, uvCol + float4(3.0f / 64.0f, 0, 0, 0))
 };
 
 return mat;
}

2. motion blur
motion blur 참고
 1. Stupid OpenGL Shader Tricks(Simon Green)

OpenGL Shader Tricks - NVidia.pdf

2. DirectX9 쉐이더 프로그래밍(타카시 이마기레)
3. Advanced Game Development with Programmable Graphics Hardware(Alan Watt, Fabio Policarpo)

간단히 정리하면
일단, motion blur는 post effect로서 동작한다.
현재 프레임의 color buffer, 이전 프레임의 color buffer, 현재 프레임의 depth buffer가 필요하다.

버텍스 쉐이더에서는 버텍스를 이동궤적으로 확장시키고 2d 상의 속도를 구하는 것이다.
속도벡터 = 현재위치 - 이전 위치;
최종 위치 = dot(노말, 속도벡터) > 0 ?  현재위치:이전위치

위와같이 하면 vertex의 궤적을 표현할 수 있다.

그리고 2D상에서의 얼마나 이동햇는지 계산한다.
perspective 공간에서 위치 계산
float4 curP = mul(현재위치, matWvp);
float4 prevP = mul(이전위치, matPrevWvp);
curP.xyz /= curP.w;
prevP.xyz .= prevP.w;
velocity =  (curP - prevP);
velocity.x *= 0.5f;
velocity.y *= -0.5f;

픽셀 쉐이더에서는 vertex shader에서 구해진 속도 벡터로 color buffer를 샘플링한다.
이 때, vertex의 depth가 texture로 들어온 depth buffer의 depth보다 크면 모션 블러를 적용하면 안된다.





BLOG main image
 Notice
 Category
분류 전체보기 (27)
life (0)
project (0)
works (24)
misc (0)
study (1)
scrap (1)
review (0)
... (0)
study_cg (0)
 TAGS
CEDEC
 Calendar
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
 Recent Entries
 Recent Comments
 Recent Trackbacks
 Archive
 Link Site
바보가 아닌 Mr
V i n t e r s o r g
 Visitor Statistics
Total :
Today :
Yesterday :
rss