SlideShare uma empresa Scribd logo
1 de 37
Baixar para ler offline
ShaderX6
3.7
Robust Order-Independent
Transparency via
Reverse Depth Peeling in DirectX 10


                ohyecloudy http://ohyecloudy.com
         shader studyhttp://cafe.naver.com/shader.cafe
                                           2010.06.21
Introduction
Depth Peeling
Reverse Depth Peeling
  Overview
  Algorithm
  Emulating Second Depth Buffer
  Optimal # of Layers
  Optimizations
Conclusion
Order-Independent Transparency
  반투명 지오메트리를 정렬 없이 편하게 그리자


왜 고생하고 있나?
  z-buffer는 fragment마다
  entry 하나만 가지도록 설계됐음.
back-to-front order
 전통적인 방식

 카메라 공간에서
 먼 지오메트리부터 가까운 지오메트리 순서로
 정렬한다.

 정렬하는 비용
   공짜는 없다.

 보통 CPU에서
   bitonic 정렬같은 방법으로 GPU에서 할 수도 있음
back-to-front order 문제점
 정렬이 per-object나 per-polygon 단위
   per-pixel이 아니라서 visual artfact 존재


 정렬한 순서대로 렌더링을 하기 때문에
 모아 찍기가 불가능
   shader switching이 많다.
per-object sorting




reverse depth peeling
Introduction
Depth Peeling
Reverse Depth Peeling
  Overview
  Algorithm
  Emulating Second Depth Buffer
  Optimal # of Layers
  Optimizations
Conclusion
from google 사전



깊이depth를 귤 껍질 까듯이
하나하나 벗겨peeling
layer에 그린다.
back-to-front order
                             blend

반투명 폴리곤
 반투명 폴리곤
  반투명 폴리곤
   반투명 폴리곤
    반투명 폴리곤
                Layer
                 Layer
                  Layer
                   Layer              Render
                    Layer
                     Layer            Target
  정렬 안 하고 렌더링



                사용하는 layer 수 만큼
                layer 추출
per-pixel 반투명 평가 가능
  visual artifact X


layer가 deferred shading에 있는
G-buffer와 닮았다.

layer는 video memory에 저장
  몇 개야! 도대체
  압박
Introduction
Depth Peeling
Reverse Depth Peeling
  Overview
  Algorithm
  Emulating Second Depth Buffer
  Optimal # of Layers
  Optimizations
Conclusion
depth peeling 메모리 사용량을 줄이자

layer 하나만 사용
  하나를 계속 업데이트해서 쓴다는 얘기.
  layer가 하나란 개념이 아니다.
  layer 추출하는 순서를 바꿨다.

depth peeling
  front-to-back order로 layer를 추출

reverse depth peeling
  back-to-front order로 layer를 추출
blend

반투명 폴리곤
 반투명 폴리곤
  반투명 폴리곤
   반투명 폴리곤
    반투명 폴리곤
                Layer
                               Render
                               Target
                 layer 추출
  정렬 안 하고 렌더링




                   사용하는 layer 수 만큼
layer = 1
                (furthermost)




Render Target
layer = 2




Render Target
layer = 3




Render Target
layer = 4
                (frontmost)




Render Target
Introduction
Depth Peeling
Reverse Depth Peeling
  Overview
  Algorithm
  Emulating Second Depth Buffer
  Optimal # of Layers
  Optimizations
Conclusion
for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)
{
  BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);
  Clear(pDepthBuffer[0], 0.0);

    BindDepthBuffer(1, pDepthBuffer[1], DisableWrites, LESS);

    SetRenderTarget(pCurrentTransparentLayer);
    SetBlendMode(ONE, ZERO);
    DrawTransparentGeometry();

    SetTexture(pCurrentTransparentLayer);
    SetRenderTarget(pMainRenderTarget);
    SetBlendMode(SRCALPHA, INVSRCALPHA);
    DrawFullscreenQuad();

    SWAP(pDepthBuffer[0], pDepthBuffer[1]);
}
for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)
{
  BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);
  Clear(pDepthBuffer[0], 0.0);
    가장 멀리 있는 반투명 fragment를 판단하기 위한 depth buffer
    BindDepthBuffer(1, pDepthBuffer[1], DisableWrites, LESS);
    Z 값을 write. GREATER 비교
    SetRenderTarget(pCurrentTransparentLayer);
    GREATER로 비교하기 때문에 0.0으로 전체를 지운다.
    SetBlendMode(ONE, ZERO);
    DrawTransparentGeometry();

    SetTexture(pCurrentTransparentLayer);
    SetRenderTarget(pMainRenderTarget);
    SetBlendMode(SRCALPHA, INVSRCALPHA);
    DrawFullscreenQuad();

    SWAP(pDepthBuffer[0], pDepthBuffer[1]);
}
for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)
{
  BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);
  Clear(pDepthBuffer[0], 0.0);

 BindDepthBuffer(1, pDepthBuffer[1], DisableWrites, LESS);
 이전 layer에서 벗겨낸 지오메트리를 또 다시 안 벗겨내기 위해서
 SetRenderTarget(pCurrentTransparentLayer);
   back – to – front 순서로 벗겨내고 있는 것을 명심
 SetBlendMode(ONE, ZERO);
   LESS 비교
 DrawTransparentGeometry();
 제외시키기 위한 용도이므로 z값을 write하지 않는다.
 SetTexture(pCurrentTransparentLayer);
 SetRenderTarget(pMainRenderTarget);
 SetBlendMode(SRCALPHA, INVSRCALPHA);
 DrawFullscreenQuad();

 SWAP(pDepthBuffer[0], pDepthBuffer[1]);
} 이번에 기록한 가장 먼 depth를
 다음 루프에서 LESS 비교 값으로 사용하기 위해
for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)
{
  BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);
  Clear(pDepthBuffer[0], 0.0);

    BindDepthBuffer(1, pDepthBuffer[1], DisableWrites, LESS);

    SetRenderTarget(pCurrentTransparentLayer);
    SetBlendMode(ONE, ZERO);
    DrawTransparentGeometry();

    Layer에 반투명 지오메트리를 렌더링한다.
     SetTexture(pCurrentTransparentLayer);
      렌더 타겟에 blend 하기 위한 임시 렌더링
    SetRenderTarget(pMainRenderTarget);
    SetBlendMode(SRCALPHA, INVSRCALPHA);
    DrawFullscreenQuad();

    SWAP(pDepthBuffer[0], pDepthBuffer[1]);
}
for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)
{
  BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);
  Clear(pDepthBuffer[0], 0.0);

    BindDepthBuffer(1, pDepthBuffer[1], DisableWrites, LESS);

    SetRenderTarget(pCurrentTransparentLayer);
    SetBlendMode(ONE, ZERO);
    DrawTransparentGeometry();

    SetTexture(pCurrentTransparentLayer);
    SetRenderTarget(pMainRenderTarget);
    SetBlendMode(SRCALPHA, INVSRCALPHA);
    DrawFullscreenQuad();
    메인 렌더 타겟에 blend한다.
    SWAP(pDepthBuffer[0], pDepthBuffer[1]);
}
Introduction
Depth Peeling
Reverse Depth Peeling
  Overview
  Algorithm
  Emulating Second Depth Buffer
  Optimal # of Layers
  Optimizations
Conclusion
for (nLayer=0; nLayer<nRequiredLayers; ++nLayer)
{
  BindDepthBuffer(0, pDepthBuffer[0], EnableWrites, GREATER);
  Clear(pDepthBuffer[0], 0.0);

    BindDepthBuffer(1, pDepthBuffer[1], DisableWrites, LESS);

    ...
}




          잠깐!

          DepthBuffer 0,1번 인덱스에 바인딩?
          이런 게 있나?
있으면 좋겠지만 그런 거 없다

단지 Pseudo-code일뿐

두 번째 테스트
 depth 값을 비교해서 버림
 쓰는 작업이 없기 때문에 구현이 간단
struct PS_INPUT
{
  float4 vPosition : SV_POSITION;
  float2 vTex : TEXCOORD0;
};

Texture2D txInputDepth;

float4 PSRenderObjects(PS_INPUT intput) : SV_TARGET
{
  // Fetch depth value from 2nd depth buffer
  float fDepth =
    txInputDepth.Load(int3(input.vPosition.xy, 0));

    // Discard fragment if LESS depth test failes
    float f = (fDepth <= input.vPosition.z);
    flip(-f);

    // calculate color and alpha etc
    ...
}
Introduction
Depth Peeling
Reverse Depth Peeling
  Overview
  Algorithm
  Emulating Second Depth Buffer
  Optimal # of Layers
  Optimizations
Conclusion
Layer를 몇 개 쓰면 될까?

간단한 답
  depth complexity로 layer 개수를 정한다.


DirectX9::GetDepthComplexity()
  현재 장면 깊이 복잡도를 구하는 함수
  이런 게 있으면 얼마나 좋을까?
  있을 리가 없다.

Layer 개수를 정해서 사용
  어느 정도 visual error 감수
  좀 더 나은 방법이 없을까?
Occlusion Queries
 pixel이 depth test를 통과했는지 못했는지
 알 수 있다.
   ID3D10Query::Begin() ~ ID3D10Query::End()
   ID3D10Query::GetData()
     • depth 테스트를 통과한 pixel 개수를 알 수 있다.


 Dynamic하게 layer 개수를 조정할 수 있겠다.
Occlusion Queries
 픽셀이 안 남을 때까지 peeling
   원칙적으로는 맞다
   성능을 높이려면 threshold를 둬서 그만 둠


 데모에선 threshold 값으로 0.01% 사용
Introduction
Depth Peeling
Reverse Depth Peeling
  Overview
  Algorithm
  Emulating Second Depth Buffer
  Optimal # of Layers
  Optimizations
Conclusion
Transform
 반투명 지오메트리를 layer마다

 stream-out
   Direct3D 10
   트랜스폼된 지오메트리를 버퍼에 저장
   다시 사용할 수 있다
   결국 트랜스폼은 한 번만 해서 여러번 사용
Fill-Rate
  dynamic branch를 사용

  float fDepth = txInputDepth.Load(int3(input.vPosition.xy, 0));


  if (input.vPosition.z < fDepth)
  {
      // Depth test passes
      // calculate color and alpha etc..
  }
  else
  {
      // Emulated depth test fails. kill fragment
      discard;
  }
Introduction
Depth Peeling
Reverse Depth Peeling
  Overview
  Algorithm
  Emulating Second Depth Buffer
  Optimal # of Layers
  Optimizations
Conclusion
depth peeling,
reverse depth peeling 개념 정리

DirectX 10은 되야지 쓸만할 것 같다.
  직접 써봐야지 평가할 수 있을 것 같음


아직까짂 가장 현실적인 해결책은
  전통적인 방법으로 sorting
  품질을 좀 양보하면 Alpha to coverage
[shaderx6] 3.7 Robust Order-Independent Transparency via Reverse Depth Peeling in DirectX 10

Mais conteúdo relacionado

Mais procurados

랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorialLee Seungeun
 
[0326 박민근] deferred shading
[0326 박민근] deferred shading[0326 박민근] deferred shading
[0326 박민근] deferred shadingMinGeun Park
 
전형규, Vertex Post-Processing Framework, NDC2011
전형규, Vertex Post-Processing Framework, NDC2011전형규, Vertex Post-Processing Framework, NDC2011
전형규, Vertex Post-Processing Framework, NDC2011devCAT Studio, NEXON
 
120106 ch 6_matte_creation_and_manipulation_web
120106 ch 6_matte_creation_and_manipulation_web120106 ch 6_matte_creation_and_manipulation_web
120106 ch 6_matte_creation_and_manipulation_webCARROTCG
 
[Shader study] Color control (2014.05.12)
[Shader study] Color control (2014.05.12)[Shader study] Color control (2014.05.12)
[Shader study] Color control (2014.05.12)해강
 
Deep Learning Into Advance - 1. Image, ConvNet
Deep Learning Into Advance - 1. Image, ConvNetDeep Learning Into Advance - 1. Image, ConvNet
Deep Learning Into Advance - 1. Image, ConvNetHyojun Kim
 
Convolution 종류 설명
Convolution 종류 설명Convolution 종류 설명
Convolution 종류 설명홍배 김
 
Practical methods for texture design web
Practical methods for texture design webPractical methods for texture design web
Practical methods for texture design webCARROTCG
 
논문-정규분포변환
논문-정규분포변환논문-정규분포변환
논문-정규분포변환jdo
 
[박민근] 3 d렌더링 옵티마이징_4 임포스터_인스턴싱
[박민근] 3 d렌더링 옵티마이징_4 임포스터_인스턴싱[박민근] 3 d렌더링 옵티마이징_4 임포스터_인스턴싱
[박민근] 3 d렌더링 옵티마이징_4 임포스터_인스턴싱MinGeun Park
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9진현 조
 
[KGC2014] 울프나이츠 엔진 프로그래밍 기록
[KGC2014] 울프나이츠 엔진 프로그래밍 기록 [KGC2014] 울프나이츠 엔진 프로그래밍 기록
[KGC2014] 울프나이츠 엔진 프로그래밍 기록 JiUng Choi
 
Implements Cascaded Shadow Maps with using Texture Array
Implements Cascaded Shadow Maps with using Texture ArrayImplements Cascaded Shadow Maps with using Texture Array
Implements Cascaded Shadow Maps with using Texture ArrayYEONG-CHEON YOU
 
Tensorflow service & Machine Learning
Tensorflow service & Machine LearningTensorflow service & Machine Learning
Tensorflow service & Machine LearningJEEHYUN PAIK
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스Sungik Kim
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shadingMinGeun Park
 
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNetjdo
 

Mais procurados (20)

랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial
 
[0326 박민근] deferred shading
[0326 박민근] deferred shading[0326 박민근] deferred shading
[0326 박민근] deferred shading
 
전형규, Vertex Post-Processing Framework, NDC2011
전형규, Vertex Post-Processing Framework, NDC2011전형규, Vertex Post-Processing Framework, NDC2011
전형규, Vertex Post-Processing Framework, NDC2011
 
120106 ch 6_matte_creation_and_manipulation_web
120106 ch 6_matte_creation_and_manipulation_web120106 ch 6_matte_creation_and_manipulation_web
120106 ch 6_matte_creation_and_manipulation_web
 
Ssao
SsaoSsao
Ssao
 
[Shader study] Color control (2014.05.12)
[Shader study] Color control (2014.05.12)[Shader study] Color control (2014.05.12)
[Shader study] Color control (2014.05.12)
 
Deep learning overview
Deep learning overviewDeep learning overview
Deep learning overview
 
Deep Learning Into Advance - 1. Image, ConvNet
Deep Learning Into Advance - 1. Image, ConvNetDeep Learning Into Advance - 1. Image, ConvNet
Deep Learning Into Advance - 1. Image, ConvNet
 
Convolution 종류 설명
Convolution 종류 설명Convolution 종류 설명
Convolution 종류 설명
 
Practical methods for texture design web
Practical methods for texture design webPractical methods for texture design web
Practical methods for texture design web
 
논문-정규분포변환
논문-정규분포변환논문-정규분포변환
논문-정규분포변환
 
[박민근] 3 d렌더링 옵티마이징_4 임포스터_인스턴싱
[박민근] 3 d렌더링 옵티마이징_4 임포스터_인스턴싱[박민근] 3 d렌더링 옵티마이징_4 임포스터_인스턴싱
[박민근] 3 d렌더링 옵티마이징_4 임포스터_인스턴싱
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9
 
[KGC2014] 울프나이츠 엔진 프로그래밍 기록
[KGC2014] 울프나이츠 엔진 프로그래밍 기록 [KGC2014] 울프나이츠 엔진 프로그래밍 기록
[KGC2014] 울프나이츠 엔진 프로그래밍 기록
 
Implements Cascaded Shadow Maps with using Texture Array
Implements Cascaded Shadow Maps with using Texture ArrayImplements Cascaded Shadow Maps with using Texture Array
Implements Cascaded Shadow Maps with using Texture Array
 
Tensorflow service & Machine Learning
Tensorflow service & Machine LearningTensorflow service & Machine Learning
Tensorflow service & Machine Learning
 
Modern gpu optimize
Modern gpu optimizeModern gpu optimize
Modern gpu optimize
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading
 
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet
[컴퓨터비전과 인공지능] 8. 합성곱 신경망 아키텍처 3 - GoogLeNet
 

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

Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blogozlael ozlael
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술Ki Hyunwoo
 
A Beginner's guide to understanding Autoencoder
A Beginner's guide to understanding AutoencoderA Beginner's guide to understanding Autoencoder
A Beginner's guide to understanding AutoencoderLee Seungeun
 
Ch.5 Deep Learning
Ch.5 Deep LearningCh.5 Deep Learning
Ch.5 Deep LearningPartPrime
 
SGL : 소프트웨어 3D 렌더링 엔진
SGL : 소프트웨어 3D 렌더링 엔진SGL : 소프트웨어 3D 렌더링 엔진
SGL : 소프트웨어 3D 렌더링 엔진SUNGCHEOL KIM
 
Hierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingHierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingYEONG-CHEON YOU
 
July report in korean
July report in koreanJuly report in korean
July report in koreannao takatoshi
 
Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .YEONG-CHEON YOU
 
[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)해강
 
Unity Surface Shader for Artist 01
Unity Surface Shader for Artist 01Unity Surface Shader for Artist 01
Unity Surface Shader for Artist 01SangYun Yi
 
Game Visual Art Technologies
Game Visual Art TechnologiesGame Visual Art Technologies
Game Visual Art TechnologiesSangYun Yi
 
Deferred Shading
Deferred ShadingDeferred Shading
Deferred Shading종빈 오
 
[박민근] 3 d렌더링 옵티마이징_2
[박민근] 3 d렌더링 옵티마이징_2[박민근] 3 d렌더링 옵티마이징_2
[박민근] 3 d렌더링 옵티마이징_2MinGeun Park
 
2015.12.10 defferd renderring_
2015.12.10 defferd renderring_2015.12.10 defferd renderring_
2015.12.10 defferd renderring_재현 최
 
NDC11_슈퍼클래스
NDC11_슈퍼클래스NDC11_슈퍼클래스
NDC11_슈퍼클래스noerror
 
딥러닝을 위한 Tensor flow(skt academy)
딥러닝을 위한 Tensor flow(skt academy)딥러닝을 위한 Tensor flow(skt academy)
딥러닝을 위한 Tensor flow(skt academy)Tae Young Lee
 
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소강 민우
 
[박민근] 3 d렌더링 옵티마이징_5 최적화 전략
[박민근] 3 d렌더링 옵티마이징_5 최적화 전략[박민근] 3 d렌더링 옵티마이징_5 최적화 전략
[박민근] 3 d렌더링 옵티마이징_5 최적화 전략MinGeun Park
 
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)민웅 이
 

Semelhante a [shaderx6] 3.7 Robust Order-Independent Transparency via Reverse Depth Peeling in DirectX 10 (20)

Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blog
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
 
Bump Mapping
Bump MappingBump Mapping
Bump Mapping
 
A Beginner's guide to understanding Autoencoder
A Beginner's guide to understanding AutoencoderA Beginner's guide to understanding Autoencoder
A Beginner's guide to understanding Autoencoder
 
Ch.5 Deep Learning
Ch.5 Deep LearningCh.5 Deep Learning
Ch.5 Deep Learning
 
SGL : 소프트웨어 3D 렌더링 엔진
SGL : 소프트웨어 3D 렌더링 엔진SGL : 소프트웨어 3D 렌더링 엔진
SGL : 소프트웨어 3D 렌더링 엔진
 
Hierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingHierachical z Map Occlusion Culling
Hierachical z Map Occlusion Culling
 
July report in korean
July report in koreanJuly report in korean
July report in korean
 
Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .
 
[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)
 
Unity Surface Shader for Artist 01
Unity Surface Shader for Artist 01Unity Surface Shader for Artist 01
Unity Surface Shader for Artist 01
 
Game Visual Art Technologies
Game Visual Art TechnologiesGame Visual Art Technologies
Game Visual Art Technologies
 
Deferred Shading
Deferred ShadingDeferred Shading
Deferred Shading
 
[박민근] 3 d렌더링 옵티마이징_2
[박민근] 3 d렌더링 옵티마이징_2[박민근] 3 d렌더링 옵티마이징_2
[박민근] 3 d렌더링 옵티마이징_2
 
2015.12.10 defferd renderring_
2015.12.10 defferd renderring_2015.12.10 defferd renderring_
2015.12.10 defferd renderring_
 
NDC11_슈퍼클래스
NDC11_슈퍼클래스NDC11_슈퍼클래스
NDC11_슈퍼클래스
 
딥러닝을 위한 Tensor flow(skt academy)
딥러닝을 위한 Tensor flow(skt academy)딥러닝을 위한 Tensor flow(skt academy)
딥러닝을 위한 Tensor flow(skt academy)
 
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
 
[박민근] 3 d렌더링 옵티마이징_5 최적화 전략
[박민근] 3 d렌더링 옵티마이징_5 최적화 전략[박민근] 3 d렌더링 옵티마이징_5 최적화 전략
[박민근] 3 d렌더링 옵티마이징_5 최적화 전략
 
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)
 

Mais de 종빈 오

트위터 봇 개발 후기
트위터 봇 개발 후기트위터 봇 개발 후기
트위터 봇 개발 후기종빈 오
 
적당한 스터디 발표자료 만들기 2.0
적당한 스터디 발표자료 만들기 2.0적당한 스터디 발표자료 만들기 2.0
적당한 스터디 발표자료 만들기 2.0종빈 오
 
페리 수열(Farey sequence)
페리 수열(Farey sequence)페리 수열(Farey sequence)
페리 수열(Farey sequence)종빈 오
 
내가 본 미드 이야기
내가 본 미드 이야기내가 본 미드 이야기
내가 본 미드 이야기종빈 오
 
비트 경제와 공짜
비트 경제와 공짜비트 경제와 공짜
비트 경제와 공짜종빈 오
 
[NDC12] 게임 물리 엔진의 내부 동작 원리 이해
[NDC12] 게임 물리 엔진의 내부 동작 원리 이해[NDC12] 게임 물리 엔진의 내부 동작 원리 이해
[NDC12] 게임 물리 엔진의 내부 동작 원리 이해종빈 오
 
[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스종빈 오
 
Intrusive data structure 소개
Intrusive data structure 소개Intrusive data structure 소개
Intrusive data structure 소개종빈 오
 
2011 아꿈사 오전반 포스트모템
2011 아꿈사 오전반 포스트모템2011 아꿈사 오전반 포스트모템
2011 아꿈사 오전반 포스트모템종빈 오
 
[프로젝트가 서쪽으로 간 까닭은] chap 17, 18, 26, 33, 81
[프로젝트가 서쪽으로 간 까닭은] chap 17, 18, 26, 33, 81[프로젝트가 서쪽으로 간 까닭은] chap 17, 18, 26, 33, 81
[프로젝트가 서쪽으로 간 까닭은] chap 17, 18, 26, 33, 81종빈 오
 
[GEG1] 3.volumetric representation of virtual environments
[GEG1] 3.volumetric representation of virtual environments[GEG1] 3.volumetric representation of virtual environments
[GEG1] 3.volumetric representation of virtual environments종빈 오
 
넘쳐나는 정보 소화 노하우
넘쳐나는 정보 소화 노하우넘쳐나는 정보 소화 노하우
넘쳐나는 정보 소화 노하우종빈 오
 
[Domain driven design] 17장 전략의 종합
[Domain driven design] 17장 전략의 종합[Domain driven design] 17장 전략의 종합
[Domain driven design] 17장 전략의 종합종빈 오
 
LevelDB 간단한 소개
LevelDB 간단한 소개LevelDB 간단한 소개
LevelDB 간단한 소개종빈 오
 
[GEG1] 2.the game asset pipeline
[GEG1] 2.the game asset pipeline[GEG1] 2.the game asset pipeline
[GEG1] 2.the game asset pipeline종빈 오
 
[TAOCP] 2.5 동적인 저장소 할당
[TAOCP] 2.5 동적인 저장소 할당[TAOCP] 2.5 동적인 저장소 할당
[TAOCP] 2.5 동적인 저장소 할당종빈 오
 
[GEG1] 24. key value dictionary
[GEG1] 24. key value dictionary[GEG1] 24. key value dictionary
[GEG1] 24. key value dictionary종빈 오
 
[TAOCP] 2.2.3 연결된 할당 - 위상정렬
[TAOCP] 2.2.3 연결된 할당 - 위상정렬[TAOCP] 2.2.3 연결된 할당 - 위상정렬
[TAOCP] 2.2.3 연결된 할당 - 위상정렬종빈 오
 
[TAOCP] 1.3.1 MIX 설명
[TAOCP] 1.3.1 MIX 설명[TAOCP] 1.3.1 MIX 설명
[TAOCP] 1.3.1 MIX 설명종빈 오
 
[GEG1] 10.camera-centric engine design for multithreaded rendering
[GEG1] 10.camera-centric engine design for multithreaded rendering[GEG1] 10.camera-centric engine design for multithreaded rendering
[GEG1] 10.camera-centric engine design for multithreaded rendering종빈 오
 

Mais de 종빈 오 (20)

트위터 봇 개발 후기
트위터 봇 개발 후기트위터 봇 개발 후기
트위터 봇 개발 후기
 
적당한 스터디 발표자료 만들기 2.0
적당한 스터디 발표자료 만들기 2.0적당한 스터디 발표자료 만들기 2.0
적당한 스터디 발표자료 만들기 2.0
 
페리 수열(Farey sequence)
페리 수열(Farey sequence)페리 수열(Farey sequence)
페리 수열(Farey sequence)
 
내가 본 미드 이야기
내가 본 미드 이야기내가 본 미드 이야기
내가 본 미드 이야기
 
비트 경제와 공짜
비트 경제와 공짜비트 경제와 공짜
비트 경제와 공짜
 
[NDC12] 게임 물리 엔진의 내부 동작 원리 이해
[NDC12] 게임 물리 엔진의 내부 동작 원리 이해[NDC12] 게임 물리 엔진의 내부 동작 원리 이해
[NDC12] 게임 물리 엔진의 내부 동작 원리 이해
 
[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스
 
Intrusive data structure 소개
Intrusive data structure 소개Intrusive data structure 소개
Intrusive data structure 소개
 
2011 아꿈사 오전반 포스트모템
2011 아꿈사 오전반 포스트모템2011 아꿈사 오전반 포스트모템
2011 아꿈사 오전반 포스트모템
 
[프로젝트가 서쪽으로 간 까닭은] chap 17, 18, 26, 33, 81
[프로젝트가 서쪽으로 간 까닭은] chap 17, 18, 26, 33, 81[프로젝트가 서쪽으로 간 까닭은] chap 17, 18, 26, 33, 81
[프로젝트가 서쪽으로 간 까닭은] chap 17, 18, 26, 33, 81
 
[GEG1] 3.volumetric representation of virtual environments
[GEG1] 3.volumetric representation of virtual environments[GEG1] 3.volumetric representation of virtual environments
[GEG1] 3.volumetric representation of virtual environments
 
넘쳐나는 정보 소화 노하우
넘쳐나는 정보 소화 노하우넘쳐나는 정보 소화 노하우
넘쳐나는 정보 소화 노하우
 
[Domain driven design] 17장 전략의 종합
[Domain driven design] 17장 전략의 종합[Domain driven design] 17장 전략의 종합
[Domain driven design] 17장 전략의 종합
 
LevelDB 간단한 소개
LevelDB 간단한 소개LevelDB 간단한 소개
LevelDB 간단한 소개
 
[GEG1] 2.the game asset pipeline
[GEG1] 2.the game asset pipeline[GEG1] 2.the game asset pipeline
[GEG1] 2.the game asset pipeline
 
[TAOCP] 2.5 동적인 저장소 할당
[TAOCP] 2.5 동적인 저장소 할당[TAOCP] 2.5 동적인 저장소 할당
[TAOCP] 2.5 동적인 저장소 할당
 
[GEG1] 24. key value dictionary
[GEG1] 24. key value dictionary[GEG1] 24. key value dictionary
[GEG1] 24. key value dictionary
 
[TAOCP] 2.2.3 연결된 할당 - 위상정렬
[TAOCP] 2.2.3 연결된 할당 - 위상정렬[TAOCP] 2.2.3 연결된 할당 - 위상정렬
[TAOCP] 2.2.3 연결된 할당 - 위상정렬
 
[TAOCP] 1.3.1 MIX 설명
[TAOCP] 1.3.1 MIX 설명[TAOCP] 1.3.1 MIX 설명
[TAOCP] 1.3.1 MIX 설명
 
[GEG1] 10.camera-centric engine design for multithreaded rendering
[GEG1] 10.camera-centric engine design for multithreaded rendering[GEG1] 10.camera-centric engine design for multithreaded rendering
[GEG1] 10.camera-centric engine design for multithreaded rendering
 

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

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