처음 지연 렌더링 Deferred Rendering 을 구현 했을때 깊이 버퍼를 Z/W 형태로 저장했습니다. 그러다 오즈라엘님의 블로그MJP 블로그를 통해 Z / FarClip 방식 통해서서도 구현이 가능하다는 것을 알고 한번 구현해보기로 했습니다.

Z / W로 부터 위치값 구하기 ( None-Linear )
// In VS
float4 ViewPosition = mul( In.Position, g_WorldViewProj );
float Depth = In.ViewPosition.z / In.ViewPosition.w;

// In PS
float Depth = tex2D( DepthSampler, In.TexCoord );
float4 H = float4( In.TexCoord.x * 2 - 1, ( 1 - In.TexCoord.y ) * 2 - 1, Depth, 1 );
float4 D = mul( H, g_ProjInv );  
float4 ViewPosition = D / D.w;

그리고 Z / FarClip 으로 부터 위치 값을 구하는 방법은 프러스텀 코너 위치를 이용해 구하는 방법등이 있는데, 이 방법은 셰이더로 프러스텀 값이랑 뭐 이거저거 넘겨주고 할게 많아서 ( 사실은 귀찮아서 ) 보류 할까 하고 있었는데, MJP의 후속 포스팅에서 보다 쉬운 방법이 있길래 그걸로 적용 해봤습니다.

Z / FarClip 으로 부터 위치 값 구하기 ( Linear )
// In VS
float4 ViewPosition = mul( In.Position, g_WorldView );
float Depth = In.ViewPosition.z / g_FarClip;

// In Ps
float Depth = tex2D( DepthSampler, In.TexCoord );
float3 vFrustumRayVS = In.CamViewPos.xyz * ( g_FarClip / In.CamViewPos.z );
float3 ViewPosition = Depth * vFrustumRayVS;

.
.
.

최종 결과물

음... 제대로 조명도 받고 잘 나오는 것 같군요.
근데... 이걸 어따 써먹지...
  1. BlogIcon 구차니 2010.09.10 23:10 신고

    음.. 외계어 난무! ㅠ.ㅠ
    도대체 무슨 이야기인지 하나도 모르겠어요 으헝헝 ㅠ.ㅠ

  2. j5267018 2011.08.03 08:24

    G_Buffer를 채울때 깊이값을

    VS()
    float4 viewPos = mul( in.pos, worldView );
    out.depth = viewPos.z/ g_farClip;

    PS()
    out.depth = float4( in.depth, 0.f, 0.f, 0.f );

    이렇게 채우고

    읽을때는 ( Full_Screen_Quad )
    VS()
    out.viewPos = mul( in.pos, worldView );

    PS()
    float depth = tex2D( depthSampler, in.texCoord );
    float3 viewPos = in.viewPos * depth;

    이렇게 했는데 결과가 영...... 이 상 합 니 다 -_-;

    티스님은 깊이버퍼를 채울때 어떻게 VS() 와 PS()를 하셨고
    읽을때 어떻게 VS()와 PS()를 하셨나요? .....

    • BlogIcon 친절한티스 2011.08.05 00:00 신고

      위에 적은 코드가 거의 전부인데요...??

      제가한 방식은 프러스텀 Ray 를 이용해서 깊이 값에서 위치를 얻어온 방식입니다. 단순히 view 행렬을 곱해서는 안되욤.

      자세한 공식이나 이론은 본문의 MJP 블로그를 참조하시면 나옵니다.

  3. j5267018 2011.08.12 10:25

    z/w로 하던걸 선형으로 바꾸고 있는데.... 잘안되네요 ㅠ.ㅠ

+ Recent posts