Edge Masking and Per-Texel Depth Extent PropagationFor Computation CullingDuring Shadow Mapping<br />ShaderX5<br />http://...
개 요<br />어떻게 하면 그림자 aliasing을 줄일 수 있을까?<br />어떻게 하면 shadow map을 잘 만들까 (X)<br />shadow map 후처리를 할 수 있는 영역을 어떻게 하면 잘 찾을 수 있을...
그림자 경계 영역 : <br />anti-aliasing을 위해 더 많은 texture fetch와 processing이 필요한 부분<br />
계산이 더 필요한 그림자 경계 영역을 구하는 두 가지 방법 소개.<br />이렇게 구한 영역만 anti-aliasing을 줄이기 위한 복잡한 연산을 한다.<br />SM 3.0 필요<br />loop, dynamic f...
Shadow map<br />Edge mask map<br />edge dilation<br />or<br />depth extent propagation<br />Computation mask map<br />
Computation Masking and Edge Dilation Using Mipchain Generation<br />Depth-Extent Propagation for Computation Masking<br />
graphics hardware에 최적화된 간단한 방법.<br />edge mask로부터 mipchain을 생성한다.<br />shadow mask의 효과적인 근사 확장<br />8 pixel로 확장하고 싶다면 mipl...
edge pixel 과 nonedge pixel 을 구분할 threshold필요.<br />highest-resolution miplevel의 edge filter 결과 값.<br />bilinear filtering을...
Computation Masking and Edge Dilation Using Mipchain Generation<br />mipchain을 생성하고 확장하려는 edge 픽셀에 맞게 miplevel을 설정한다.<br /...
depth extent map<br />확장된 edge mask 대신에 light로부터 min, max 거리 사용.<br />	edge-filtered shadow map 사용<br />
shadow map 텍스쳐 좌표가 주어 졌을때(확장된 edge 영역),<br />z 좌표가 min, max 사이일 때만 복잡한 연산 수행.<br />edge<br />9 점에서 min, max 값을 뽑아서 저장<br /...
float4ps_EdgeMapRGMinMax( float2oTex : TEXCOORD0 ) : COLOR0<br />{<br />float4neighborOffsets[4] = {<br />		{ 1.0, 0.0, 0,...
Mipchain<br />min, max 때문에 filtering으로 생성(X).<br />PS를 만들어서 생성한다.<br />float4 ps_MipLevel3x3MinMaxRG(<br />float4 oTex0 : ...
float4 ps_LightPassPDisk12RandRotPCFCondEdgeDepthExtent(<br />float3 oTex0 : TEXCOORD0,	// normal in world space<br />floa...
Computation Masking and Edge Dilation Using Mipchain Generation<br />mipchain을 생성하고 확장하려는 edge 픽셀에 맞게 miplevel을 설정한다.<br /...
결론<br />최대 3배까지 성능 향상.<br />	edge map, mipmap을 생성하더라도 부분적으로만 많은 tap의 PCF를 거는 게 싸다는 결론<br />Image-processing 연산.<br />	stan...
Upcoming SlideShare
Loading in …5
×

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

1,280 views

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,280
On SlideShare
0
From Embeds
0
Number of Embeds
168
Actions
Shares
0
Downloads
18
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

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

×