0402 Z프리패스
글좀 수정한다.
중요한 건 다음과 같다.
1. zPre패스에서는 뎁스 write를 켜고, Less로 설정한다.
2. 라이팅 패스 하기 전에, 라이팅 FBO로 Depth를 Blit한다.
3. 라이팅 패스에서는 뎁스 write를 끄고, LessEqual로 설정한다
이때, LessEqual인 이유는 "앞에서 그린 뎁스에 자신이 포함되기 때문"에
자신의 뎁스에 자신이 가려짐을 방지하기 위함이며,
4. 이후에는 뎁스 write를 다시 켜고, Less로 재설정한다.
그냥!!
전체 씬 렌더링하기 전에!!!!
"뎁스 버퍼"를 미리 채운다!!!!
바로 "비어있는 fragment shader"를 사용해서!!!
근데 이제 전체 씬의 뎁스를 먼저 채우는 거지.
그리고!!!
중요한건!!!!
zPrePass를 통해서 "뎁스 맵을 미리 채울때는"
"Opaque = 불투명" 한 오브젝트의 뎁스만 기록해 둔다.
-> 왜냐면, 반투명한 오브젝트는 뎁스가 있어도
뒤에 있는 오브젝트가 그려질 수 있기 때문이다.
반투명한걸 굳이 그리고 싶다면,
뒤에서 앞으로 그려야 한다.
이게 작동하는 이유는, 중간에 그려지는 오브젝트는 상대적으로 나중에 그려지는
오브젝트에 의해 "가려질 가능성이 있음에도" *** 일단 그리기는 한다 ***.
하지만, 전체 씬 패스를 한번 돌고 나면, 중간 오브젝트는
"아, 나는 결국엔 다른 오브젝트에게 가려지겠구나" 하고 그리지 않는다.
결론
- 비어있는 Fragment Shader를 사용해서 뎁스만 기록
- 오직 Opaque한 물체만 미리 기록
전체 씬 (뎁스만) 렌더링 -> 전체 씬 렌더링
= 초반에 그려지는 물체가 그때 그시절 구닥다리 뎁스버퍼가 아닌
"최신의 뎁스 버퍼"를 참조하기 때문에
빠르게 자신의 분수를 알고 짜질 수 있다.