OpenGL에서 깊이 버퍼의 깊이 범위를 어떻게 알 수 있습니까?


11

iOS 용 GL 멀티 패스 렌더링 앱을하고 있습니다. 첫 번째 패스는 깊이 버퍼 텍스처로 렌더링됩니다. 두 번째 패스는 깊이 버퍼의 값을 사용하여 조각 셰이더의 적용을 제어합니다. 깊이 버퍼의 값을 유용한 것으로 재조정하고 싶지만 그렇게하기 전에 깊이 버퍼 값의 깊이 값 범위를 알아야합니다. 어떻게해야합니까?

답변:


10

깊이 버퍼에 기록 된 값의 범위는 원하는 값입니다. 일반적으로 0 대 1 범위에 속합니다. 깊이 버퍼에 기록 된 실제 값은 NDC 공간에서 정점의 Z 값 (클립 공간에서 원근을 w로 나눈 후)을 기준으로 뷰포트 변환 중에 계산됩니다.

NDC 깊이 값 (원근 분할을 W로 나눈 후 Z)은 뷰포트 변환의 ​​깊이 부분에 따라 크기가 조정되며 (X 및 Y 좌표를 창에서 픽셀과 연결할 좌표 공간으로 가져옵니다) (2^n-1)- "두의 전력으로 읽을 수 의미하는 것 n"- n깊이 버퍼의 비트 정밀도입니다. 결과 값은 깊이 버퍼에 기록됩니다.

OpenGL은 뷰포트 변환 매트릭스의 정의를 glViewportglDepthRange 호출로 분할 합니다. glDepthRange는 요청하는 깊이 범위를 결정하는 책임 요인을 제어합니다. 선택기로 glGetFloatv 를 호출 GL_DEPTH_RANGE하여 현재 범위를 복구 할 수 있습니다 . 이렇게하면 범위가 0 대 1이라고 가정하지 않고 범위를 활용할 수 있습니다 (실제로 99.9 %의 시간은 변경하지 않습니다).

눈값에서 깊이 버퍼까지 Z 값을 따르도록 수학을 재구성하는 방법에 대한 통찰력을 원한다면 추가로 읽어보십시오.


나는 이것을 스터드에게 추가적인 참고 자료와 삼각형 평면성에 대한 팁을 위해 Josh에게 줄 것이다. 깊이 맵이 좋은 값을 갖도록 렌더링하는 지오메트리의 z-extent와 정확히 일치하도록 가까운 / 먼 클립 평면에 위치하는 해킹을하는 경향이 있습니다. 내가 뭘까? 패스 # 1 깊이 맵에 무엇이 있는지에 따라 패스 # 2 동안 흥미로운 위치 별 흐림 효과를 만들고 싶습니다.
dugla

7

깊이 버퍼의 값은 항상 0-1 사이입니다. 0은 렌더링 된 조각의 깊이가 평면에 가깝고 1은 조각의 깊이가 먼 평면에 있다는 것입니다. 그리고 그 사이의 모든 것.

월드 공간에서 실제 깊이를 알고 싶다면 깊이 버퍼에서 쉽게 계산할 수 있습니다.

depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;

그렇기 때문에 투영 버퍼에서 근거리 및 원거리 평면을 지정하여 깊이 버퍼의 정확도를 높일 수 있습니다.

깊이 버퍼 값을 사용할 때 깊이와 거리의 차이도 알고 있어야합니다.


@ 노트 거의 다 왔어. depthbuffer의 값 범위를 정확히 0-> 1로 조정하고 싶습니다. 따라서 렌더링 된 최소 / 최대 깊이 값이 .25 / .75이면 (depthvalue-.25) / (. 75-.25)가 필요합니다. 따라서, 패스 1 다음에
깊이

1
@dugla : 평면 인 삼각형을 렌더링하므로 최소 및 최대 깊이 값이 장면의 최소 및 최대 정점과 연관됩니다. 이 두 가지를 알고 있으면 파이프 라인을 통해 수동으로 변환 할 수 있으며 깊이 버퍼에 기록 할 최소값과 최대 값을 알 수 있습니다. 이는 렌더링 한 다음 전체 깊이 버퍼를 다시 읽고 반복하는 것보다 쉽습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.