2. 목차
• Motivation
• DX10을 사용한 NVIDIA의 방식
• 제약 및 개선
• ?
3. Motivation
• 텍스쳐 스크롤 방식
– 비가 카메라를 따라다닌다.
– 라이트 처리가 힘들다.
• 파티클 방식
– 사실적인 라이트 처리가 가능하다.
– 하지만 부하가 많다.
얼마나 빠르게 많이 그릴 것인가?
4. DX10을 이용한 NVIDIA 방식
1. 버텍스버퍼에 파티클 위치 초기화
카메라 주변에만 뿌린다(예제에서는 45M)
2. 파티클 위치갱신 (Draw#1)
VS : 버텍스버퍼를 input으로 받아서 연산
GS : 타겟버퍼로 VS의 output을 저장
3. 파티클 Render (Draw#2)
GS : 2-2의 1점을 4개의 빌보드점으로 생성
PS : 라이팅 연산 및 파티클 랜더링
4. 물체 Render (Draw#3)
PS : 메쉬에 물방울이 튕기는 효과 (섭동)
5. * 섭동
float3 Tan = normalize(In.Tan);
float3 InNormal = normalize(In.Normal);
float wetSurf = saturate(5*saturate(InNormal.y)); // 평평한 부분에서만 섭동되도록
… 생략 …
float4 N = SceneTextureNormal.Sample( samAniso, In.Texture ); // object의 normal
// SplashBumpTexture는 3D Texture
float4 BumpMapVal = SplashBumpTexture.Sample(samAnisoMirror,
float3(In.worldPos.x/2.0 + g_splashXDisplace,
In.worldPos.z/2.0 + g_splashYDisplace,
g_timeCycle))
- 0.5;
N += wetSurf * 2 * (BumpMapVal.x * Tan + BumpMapVal.y * binorm);
N = normalize(N); // 섭동에 따른 Normal 변경
// 섭동에 따른 색 변경
float3 splashDiffuse = wetSurf * SplashDiffuseTexture.Sample(samAnisoMirror,
float3(In.worldPos.xz, g_timeCycle));
6.
7.
8. 제약 및 개선
• GeometryShader가 없다!!
• 우리의 계획
– Position Index가 담긴 버텍스버퍼를 가능한 많이
만들어 놓는다.
– 텍스쳐(A32R32G32B32)를 랜더타겟으로 위치정
보를 연산한다.
– 파티클 렌더링(VS)
• Index를 가지고 텍스쳐에서 포지션을 가져온다.
• 위치텍스쳐의 픽셀좌표 = index/4
• 트라이앵글순서 = index%4