ShaderX6<br />3.7 Robust Order-Independent Transparency via Reverse Depth Peeling in DirectX 10<br />ohyecloudyhttp://ohye...
Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer...
Order-Independent Transparency<br />반투명 지오메트리를정렬 없이 편하게 그리자<br />왜 고생하고 있나?<br />z-buffer는 fragment마다<br />entry 하나만 가지도록 ...
back-to-front order<br />전통적인 방식<br />카메라 공간에서<br />먼 지오메트리부터 가까운 지오메트리 순서로<br />정렬한다.<br />정렬하는 비용<br />공짜는 없다.<br />보통 C...
back-to-front order 문제점<br />정렬이 per-object나 per-polygon단위<br />per-pixel이 아니라서 visual artfact존재<br />정렬한 순서대로 렌더링을 하기 때문에...
per-object sorting<br />reverse depth peeling<br />
Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer...
from google사전<br />깊이depth를 귤 껍질 까듯이하나하나 벗겨peelinglayer에 그린다.<br />
back-to-front order<br />blend<br />반투명 폴리곤<br />Layer<br />반투명 폴리곤<br />Layer<br />반투명 폴리곤<br />Layer<br />반투명 폴리곤<br />L...
per-pixel반투명 평가 가능<br />visual artifact X<br />layer가 deferred shading에 있는<br />G-buffer와 닮았다.<br />layer는 video memory에 저...
Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer...
depth peeling 메모리 사용량을 줄이자<br />layer 하나만 사용<br />하나를 계속 업데이트해서 쓴다는 얘기.<br />layer가 하나란 개념이 아니다.<br />layer 추출하는 순서를 바꿨다.<...
blend<br />반투명 폴리곤<br />Layer<br />반투명 폴리곤<br />반투명 폴리곤<br />반투명 폴리곤<br />반투명 폴리곤<br />Render<br />Target<br />layer 추출<br...
layer = 1<br />(furthermost)<br />Render Target<br />
layer = 2<br />Render Target<br />
layer = 3<br />Render Target<br />
layer = 4<br />(frontmost)<br />Render Target<br />
Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer...
for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)<br />{<br />BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);<b...
for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)<br />{<br />BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);<b...
for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)<br />{<br />BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);<b...
for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)<br />{<br />BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);<b...
for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)<br />{<br />BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);<b...
Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer...
for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)<br />{<br />BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);<b...
있으면 좋겠지만 그런 거 없다<br />단지 Pseudo-code일뿐<br />두 번째 테스트<br />depth 값을 비교해서 버림<br />쓰는 작업이 없기 때문에 구현이 간단<br />
struct PS_INPUT<br />{<br /> float4 vPosition : SV_POSITION;<br /> float2 vTex : TEXCOORD0;<br />};<br />Texture2D txInput...
Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer...
Layer를 몇 개 쓰면 될까?<br />간단한 답<br />depth complexity로 layer 개수를 정한다.<br />DirectX9::GetDepthComplexity()<br />현재 장면 깊이 복잡도를 ...
Occlusion Queries<br />pixel이 depth test를 통과했는지 못했는지<br />알 수 있다.<br />ID3D10Query::Begin() ~ ID3D10Query::End()<br />ID3D...
Occlusion Queries<br />픽셀이 안 남을 때까지 peeling<br />원칙적으로는 맞다<br />성능을 높이려면 threshold를 둬서 그만 둠<br />데모에선 threshold 값으로 0.01% ...
Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer...
Transform<br />반투명 지오메트리를layer마다<br />stream-out<br />Direct3D 10<br />트랜스폼된지오메트리를 버퍼에 저장<br />다시 사용할 수 있다<br />결국 트랜스폼은 한...
Fill-Rate<br />dynamic branch를 사용<br />float fDepth = txInputDepth.Load(int3(input.vPosition.xy, 0));<br />if (input.vPosi...
Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer...
depth peeling,reverse depth peeling 개념 정리<br />DirectX 10은 되야지 쓸만할 것 같다.<br />직접 써봐야지 평가할 수 있을 것 같음<br />아직까진 가장 현실적인 해결책은...
끝<br />
Upcoming SlideShare
Loading in …5
×

[shaderx6] 3.7 Robust Order-Independent Transparency via Reverse Depth Peeling in DirectX 10

2,360 views

Published on

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

  • Be the first to like this

No Downloads
Views
Total views
2,360
On SlideShare
0
From Embeds
0
Number of Embeds
436
Actions
Shares
0
Downloads
21
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

[shaderx6] 3.7 Robust Order-Independent Transparency via Reverse Depth Peeling in DirectX 10

  1. 1. ShaderX6<br />3.7 Robust Order-Independent Transparency via Reverse Depth Peeling in DirectX 10<br />ohyecloudyhttp://ohyecloudy.com<br />shader studyhttp://cafe.naver.com/shader.cafe<br />
  2. 2. Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer<br />Optimal # of Layers<br />Optimizations<br />Conclusion<br />
  3. 3. Order-Independent Transparency<br />반투명 지오메트리를정렬 없이 편하게 그리자<br />왜 고생하고 있나?<br />z-buffer는 fragment마다<br />entry 하나만 가지도록 설계됐음.<br />
  4. 4. back-to-front order<br />전통적인 방식<br />카메라 공간에서<br />먼 지오메트리부터 가까운 지오메트리 순서로<br />정렬한다.<br />정렬하는 비용<br />공짜는 없다.<br />보통 CPU에서<br />bitonic정렬같은 방법으로 GPU에서 할 수도 있음<br />
  5. 5. back-to-front order 문제점<br />정렬이 per-object나 per-polygon단위<br />per-pixel이 아니라서 visual artfact존재<br />정렬한 순서대로 렌더링을 하기 때문에<br />모아 찍기가 불가능<br />shader switching이 많다.<br />
  6. 6. per-object sorting<br />reverse depth peeling<br />
  7. 7. Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer<br />Optimal # of Layers<br />Optimizations<br />Conclusion<br />
  8. 8. from google사전<br />깊이depth를 귤 껍질 까듯이하나하나 벗겨peelinglayer에 그린다.<br />
  9. 9. back-to-front order<br />blend<br />반투명 폴리곤<br />Layer<br />반투명 폴리곤<br />Layer<br />반투명 폴리곤<br />Layer<br />반투명 폴리곤<br />Layer<br />반투명 폴리곤<br />Layer<br />Render<br />Target<br />Layer<br />정렬 안 하고 렌더링<br />사용하는 layer 수 만큼<br />layer 추출<br />
  10. 10. per-pixel반투명 평가 가능<br />visual artifact X<br />layer가 deferred shading에 있는<br />G-buffer와 닮았다.<br />layer는 video memory에 저장<br />몇 개야! 도대체<br />압박<br />
  11. 11. Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer<br />Optimal # of Layers<br />Optimizations<br />Conclusion<br />
  12. 12. depth peeling 메모리 사용량을 줄이자<br />layer 하나만 사용<br />하나를 계속 업데이트해서 쓴다는 얘기.<br />layer가 하나란 개념이 아니다.<br />layer 추출하는 순서를 바꿨다.<br />depth peeling<br />front-to-back order로 layer를 추출<br />reverse depth peeling<br />back-to-front order로 layer를 추출<br />
  13. 13. blend<br />반투명 폴리곤<br />Layer<br />반투명 폴리곤<br />반투명 폴리곤<br />반투명 폴리곤<br />반투명 폴리곤<br />Render<br />Target<br />layer 추출<br />정렬 안 하고 렌더링<br />사용하는 layer 수 만큼<br />
  14. 14. layer = 1<br />(furthermost)<br />Render Target<br />
  15. 15. layer = 2<br />Render Target<br />
  16. 16. layer = 3<br />Render Target<br />
  17. 17. layer = 4<br />(frontmost)<br />Render Target<br />
  18. 18. Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer<br />Optimal # of Layers<br />Optimizations<br />Conclusion<br />
  19. 19. for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)<br />{<br />BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);<br /> Clear(pDepthBuffer[0], 0.0);<br />BindDepthBuffer(1, pDepthBuffer[1], DisableWrites, LESS);<br />SetRenderTarget(pCurrentTransparentLayer);<br />SetBlendMode(ONE, ZERO);<br />DrawTransparentGeometry();<br />SetTexture(pCurrentTransparentLayer);<br />SetRenderTarget(pMainRenderTarget);<br />SetBlendMode(SRCALPHA, INVSRCALPHA);<br />DrawFullscreenQuad();<br /> SWAP(pDepthBuffer[0], pDepthBuffer[1]);<br />}<br />
  20. 20. for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)<br />{<br />BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);<br /> Clear(pDepthBuffer[0], 0.0);<br />BindDepthBuffer(1, pDepthBuffer[1], DisableWrites, LESS);<br />SetRenderTarget(pCurrentTransparentLayer);<br />SetBlendMode(ONE, ZERO);<br />DrawTransparentGeometry();<br />SetTexture(pCurrentTransparentLayer);<br />SetRenderTarget(pMainRenderTarget);<br />SetBlendMode(SRCALPHA, INVSRCALPHA);<br />DrawFullscreenQuad();<br /> SWAP(pDepthBuffer[0], pDepthBuffer[1]);<br />}<br />가장 멀리 있는 반투명 fragment를 판단하기 위한 depth buffer<br />Z 값을 write. GREATER 비교<br />GREATER로 비교하기 때문에 0.0으로 전체를 지운다.<br />
  21. 21. for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)<br />{<br />BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);<br /> Clear(pDepthBuffer[0], 0.0);<br />BindDepthBuffer(1, pDepthBuffer[1], DisableWrites, LESS);<br />SetRenderTarget(pCurrentTransparentLayer);<br />SetBlendMode(ONE, ZERO);<br />DrawTransparentGeometry();<br />SetTexture(pCurrentTransparentLayer);<br />SetRenderTarget(pMainRenderTarget);<br />SetBlendMode(SRCALPHA, INVSRCALPHA);<br />DrawFullscreenQuad();<br />SWAP(pDepthBuffer[0], pDepthBuffer[1]);<br />}<br />이전 layer에서 벗겨낸 지오메트리를 또 다시 안 벗겨내기 위해서<br /> back – to – front 순서로 벗겨내고 있는 것을 명심<br /> LESS 비교<br />제외시키기 위한 용도이므로 z값을 write하지 않는다.<br />이번에 기록한 가장 먼 depth를 <br />다음 루프에서 LESS 비교 값으로 사용하기 위해 <br />
  22. 22. for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)<br />{<br />BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);<br /> Clear(pDepthBuffer[0], 0.0);<br />BindDepthBuffer(1, pDepthBuffer[1], DisableWrites, LESS);<br />SetRenderTarget(pCurrentTransparentLayer);<br />SetBlendMode(ONE, ZERO);<br />DrawTransparentGeometry();<br />SetTexture(pCurrentTransparentLayer);<br />SetRenderTarget(pMainRenderTarget);<br />SetBlendMode(SRCALPHA, INVSRCALPHA);<br />DrawFullscreenQuad();<br /> SWAP(pDepthBuffer[0], pDepthBuffer[1]);<br />}<br />Layer에 반투명 지오메트리를 렌더링한다.<br />렌더타겟에blend 하기 위한 임시 렌더링<br />
  23. 23. for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)<br />{<br />BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);<br /> Clear(pDepthBuffer[0], 0.0);<br />BindDepthBuffer(1, pDepthBuffer[1], DisableWrites, LESS);<br />SetRenderTarget(pCurrentTransparentLayer);<br />SetBlendMode(ONE, ZERO);<br />DrawTransparentGeometry();<br />SetTexture(pCurrentTransparentLayer);<br />SetRenderTarget(pMainRenderTarget);<br />SetBlendMode(SRCALPHA, INVSRCALPHA);<br />DrawFullscreenQuad();<br /> SWAP(pDepthBuffer[0], pDepthBuffer[1]);<br />}<br />메인 렌더타겟에blend한다.<br />
  24. 24. Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer<br />Optimal # of Layers<br />Optimizations<br />Conclusion<br />
  25. 25. for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)<br />{<br />BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);<br /> Clear(pDepthBuffer[0], 0.0);<br />BindDepthBuffer(1, pDepthBuffer[1], DisableWrites, LESS);<br /> ...<br />}<br />잠깐!<br />DepthBuffer 0,1번 인덱스에 바인딩?<br />이런 게 있나?<br />
  26. 26. 있으면 좋겠지만 그런 거 없다<br />단지 Pseudo-code일뿐<br />두 번째 테스트<br />depth 값을 비교해서 버림<br />쓰는 작업이 없기 때문에 구현이 간단<br />
  27. 27. struct PS_INPUT<br />{<br /> float4 vPosition : SV_POSITION;<br /> float2 vTex : TEXCOORD0;<br />};<br />Texture2D txInputDepth;<br />float4 PSRenderObjects(PS_INPUT intput) : SV_TARGET<br />{<br /> // Fetch depth value from 2nd depth buffer<br /> float fDepth = <br />txInputDepth.Load(int3(input.vPosition.xy, 0));<br />// Discard fragment if LESS depth test failes<br /> float f = (fDepth <= input.vPosition.z);<br />clip(-f);<br /> // calculate color and alpha etc<br /> ...<br />}<br />
  28. 28. Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer<br />Optimal # of Layers<br />Optimizations<br />Conclusion<br />
  29. 29. Layer를 몇 개 쓰면 될까?<br />간단한 답<br />depth complexity로 layer 개수를 정한다.<br />DirectX9::GetDepthComplexity()<br />현재 장면 깊이 복잡도를 구하는 함수<br />이런 게 있으면 얼마나 좋을까?<br />있을 리가 없다.<br />Layer 개수를 정해서 사용<br />어느 정도 visual error 감수<br />좀 더 나은 방법이 없을까?<br />
  30. 30. Occlusion Queries<br />pixel이 depth test를 통과했는지 못했는지<br />알 수 있다.<br />ID3D10Query::Begin() ~ ID3D10Query::End()<br />ID3D10Query::GetData()<br />depth 테스트를 통과한 pixel 개수를 알 수 있다.<br />Dynamic하게 layer 개수를 조정할 수 있겠다.<br />
  31. 31. Occlusion Queries<br />픽셀이 안 남을 때까지 peeling<br />원칙적으로는 맞다<br />성능을 높이려면 threshold를 둬서 그만 둠<br />데모에선 threshold 값으로 0.01% 사용<br />
  32. 32. Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer<br />Optimal # of Layers<br />Optimizations<br />Conclusion<br />
  33. 33. Transform<br />반투명 지오메트리를layer마다<br />stream-out<br />Direct3D 10<br />트랜스폼된지오메트리를 버퍼에 저장<br />다시 사용할 수 있다<br />결국 트랜스폼은 한 번만 해서 여러번 사용<br />
  34. 34. Fill-Rate<br />dynamic branch를 사용<br />float fDepth = txInputDepth.Load(int3(input.vPosition.xy, 0));<br />if (input.vPosition.z < fDepth)<br />{<br /> // Depth test passes<br /> // calculate color and alpha etc..<br />}<br />else<br />{<br /> // Emulated depth test fails. kill fragment<br /> discard;<br />}<br />
  35. 35. Introduction<br />Depth Peeling<br />Reverse Depth Peeling<br />Overview<br />Algorithm<br />Emulating Second Depth Buffer<br />Optimal # of Layers<br />Optimizations<br />Conclusion<br />
  36. 36. depth peeling,reverse depth peeling 개념 정리<br />DirectX 10은 되야지 쓸만할 것 같다.<br />직접 써봐야지 평가할 수 있을 것 같음<br />아직까진 가장 현실적인 해결책은<br />전통적인 방법으로 sorting<br />품질을 좀 양보하면Alpha to coverage<br />
  37. 37. 끝<br />

×