• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
[ShaderX5] 4.4 Edge Masking and Per-Texel Depth Extent Propagation For Computation Culling During Shadow Mapping.
 

[ShaderX5] 4.4 Edge Masking and Per-Texel Depth Extent Propagation For Computation Culling During Shadow Mapping.

on

  • 1,394 views

 

Statistics

Views

Total Views
1,394
Views on SlideShare
1,234
Embed Views
160

Actions

Likes
0
Downloads
15
Comments
0

6 Embeds 160

http://ohyecloudy.com 118
http://dodoubt.tistory.com 34
http://www.linkedin.com 3
http://0.0.0.0 3
http://www.hanrss.com 1
http://www.slideshare.net 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    [ShaderX5] 4.4 Edge Masking and Per-Texel Depth Extent Propagation For Computation Culling During Shadow Mapping. [ShaderX5] 4.4 Edge Masking and Per-Texel Depth Extent Propagation For Computation Culling During Shadow Mapping. Presentation Transcript

    • Edge Masking and Per-Texel Depth Extent PropagationFor Computation CullingDuring Shadow Mapping
      ShaderX5
      http://ohyecloudy.com
      http://cafe.naver.com/shader.cafe
    • 개 요
      어떻게 하면 그림자 aliasing을 줄일 수 있을까?
      어떻게 하면 shadow map을 잘 만들까 (X)
      shadow map 후처리를 할 수 있는 영역을 어떻게 하면 잘 찾을 수 있을까 (O)
    • 그림자 경계 영역 :
      anti-aliasing을 위해 더 많은 texture fetch와 processing이 필요한 부분
    • 계산이 더 필요한 그림자 경계 영역을 구하는 두 가지 방법 소개.
      이렇게 구한 영역만 anti-aliasing을 줄이기 위한 복잡한 연산을 한다.
      SM 3.0 필요
      loop, dynamic flow control 등 제대로 된 flow-control을 사용할 수 있다.
    • Shadow map
      Edge mask map
      edge dilation
      or
      depth extent propagation
      Computation mask map
    • Computation Masking and Edge Dilation Using Mipchain Generation
      Depth-Extent Propagation for Computation Masking
    • graphics hardware에 최적화된 간단한 방법.
      edge mask로부터 mipchain을 생성한다.
      shadow mask의 효과적인 근사 확장
      8 pixel로 확장하고 싶다면 miplevel을 3.
    • edge pixel 과 nonedge pixel 을 구분할 threshold필요.
      highest-resolution miplevel의 edge filter 결과 값.
      bilinear filtering을 사용
      2x2 box filtering을 사용하면 mip level이 올라갈수록 모든 방향으로 확장되는게 아니라 한쪽으로 확장되는 경우가 발생.
    • Computation Masking and Edge Dilation Using Mipchain Generation
      mipchain을 생성하고 확장하려는 edge 픽셀에 맞게 miplevel을 설정한다.
      Depth-Extent Propagation for Computation Masking
    • depth extent map
      확장된 edge mask 대신에 light로부터 min, max 거리 사용.
      edge-filtered shadow map 사용
    • shadow map 텍스쳐 좌표가 주어 졌을때(확장된 edge 영역),
      z 좌표가 min, max 사이일 때만 복잡한 연산 수행.
      edge
      9 점에서 min, max 값을 뽑아서 저장
      edge가 아니므로 min = 1, max = 0 으로 저장
    • float4ps_EdgeMapRGMinMax( float2oTex : TEXCOORD0 ) : COLOR0
      {
      float4neighborOffsets[4] = {
      { 1.0, 0.0, 0, 0 },
      {-1.0, 0.0, 0, 0 },
      { 0.0, 1.0, 0, 0 },
      { 0.0,-1.0, 0, 0 }
      };
      floatcenterTapDepth = tex2D( ShadowSampler, oTex ).r;
      for( inti=0; i< 4; i++ )
      {
      currTapDepth = tex2D( ShadowSampler, oTex+(g_vFullTexelOffset*neighborOffsets[i]) ).r;
      depthDiff = abs( centerTapDepth - currTapDepth );
      if( depthDiff > g_fMinEdgeDelta )
      {
      furthestTapDepth = max( currTapDepth, centerTapDepth );
      furthestTepDepthMin = min( furthestTepDepthMin, furthestTapDepth );
      furthestTepDepthMax = max( furthestTepDepthMax, furthestTapDepth );
      }
      }
      outColor.r = furthestTapDepthMin;
      outColor.g = furthestTapDepthMax;
      returnoutColor;
      }
    • Mipchain
      min, max 때문에 filtering으로 생성(X).
      PS를 만들어서 생성한다.
      float4 ps_MipLevel3x3MinMaxRG(
      float4 oTex0 : TEXCOORD0,
      float4oFullTexelOffset : TEXCOORD1 ) : COLOR0
      {
      float4tapOffset = oFullTexelOffset;
      outCol.rg = tex2Dlod( ShadowMipPointSampler, oTex0 ).rg;
      // 1, 1, 0, 0
      tapVals = tex2Dlod( ShadowMipPointSampler, oTex0 +
      ( tapOffset * float4(1, 1, 0, 0) ) ).rg;
      outCol.r = min( outCol.r, tapVals.r );
      outCol.g = max( outCol.g, tapVals.g );
      // 0, 1, 0, 0
      // 1, 0, 0, 0
      // -1, 1, 0, 0
      // -1, 0, 0, 0
      // 1, -1, 0, 0
      // 0, -1, 0, 0
      // -1, -1, 0, 0
      returnoutCol;
      }
    • float4 ps_LightPassPDisk12RandRotPCFCondEdgeDepthExtent(
      float3 oTex0 : TEXCOORD0, // normal in world space
      float4 oTex1 : TEXCOORD1, // shadow map texcoords
      float3 oTex2 : TEXCOORD2,
      float2vPos : VPOS ) // world space light vector (not normalized
      : COLOR0
      {
      projCoords.xyz = oTex1 / oTex1.w;
      projCoords.w = 0;
      lightVal = ComputeLighting(oTex1, dist, oTex2, oTex0 );
      if( dot(lightVal, float3(1, 1, 1) ) == 0 )
      {
      return 0;
      }
      else
      {
      projCoords.w = g_fEdgeMaskMipLevel - 1; // going up 1 miplevel
      edgeValMinMax = tex2Dlod( EdgeMipPointSampler, projCoords ).rg;
      if( (edgeValMinMax.r > projCoords.z ) || (edgeValMinMax.g < projCoords.z ) )
      {
      // simple shadow map test
      }
      else
      {
      // complex processing. ex) PCF 12taps
      }
      }
      }
      use depth extent map
    • Computation Masking and Edge Dilation Using Mipchain Generation
      mipchain을 생성하고 확장하려는 edge 픽셀에 맞게 miplevel을 설정한다.
      Depth-Extent Propagation for Computation Masking
      3x3의 min, max depth값을 기록해 depth extent map을 만들고 projection된 shadow map 텍스쳐z좌표와 비교해 min, max 범위 안이면 복잡한 연산을 한다.
    • 결론
      최대 3배까지 성능 향상.
      edge map, mipmap을 생성하더라도 부분적으로만 많은 tap의 PCF를 거는 게 싸다는 결론
      Image-processing 연산.
      standard shadow mapping 알고리즘을 사용.
      추가적인 geometry 정보가 필요 없다.