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 수 만큼
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]);
}
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% 사용
36. depth peeling,
reverse depth peeling 개념 정리
DirectX 10은 되야지 쓸만할 것 같다.
직접 써봐야지 평가할 수 있을 것 같음
아직까짂 가장 현실적인 해결책은
전통적인 방법으로 sorting
품질을 좀 양보하면 Alpha to coverage