2014-08-30 3 views
8

이 질문은 OpenGL보다 더 많은 질문 이겠지만 나는 빗나가 다. 어쨌든, 원근감 나누기의 목적이 쓸모있는 x와 y 좌표를 얻는 것이라면, 왜 z를 w로 나눌까요? 또한 어떻게 처음부터 w를 얻을 수 있습니까?왜 OpenGL의 원근 투영에서 Z로 W를 나눕니까?

+0

http : //en.wikipedia.org/wiki/Transformation_matrix # Perspective_projection –

+0

이것은 동질적인 좌표와 관련이 있습니다. R^3 -> R^4를 매핑하는 것은 명확하게 일대일이 아닙니다. w 인자는 'cannonized'일 수 있습니다. 그러나 4x4 행렬 연산자를 적용한 결과 'w'가 바뀔 수 있습니다. 올바르게 기억한다면 균질 좌표계의 한 가지 이점은 선형 연산자로 변환하는 것입니다. – Yotam

답변

12

사실, 설명은 수학보다 깊이 버퍼의 제한 사항과 더 관련이 있습니다.

가장 간단하게 "깊이 버퍼는 각 화면상의 픽셀에 카메라와의 거리에 따라 그레이 스케일 값이 할당되는 텍스처로, 시각적 효과를 거리에 따라 쉽게 변경할 수 있습니다."

  • Z 가까운 클리핑 평면으로부터의 거리 : Source

    더 정확하게, 깊이 버퍼는 각 fragment 대한w Z/의 값을 포함하는 감촉 조각에.

  • W은 카메라에서 단편까지의 거리입니다. Z, 와트Z/w 사이의 관계를 나타내는 다음 도면에서

, NgluPerspective에 전달 zNear 파라미터 또는 동등한 기능 같고, f은 동일한 기능으로 전달 된 zFar 매개 변수와 같습니다. 눈에서

Diagram illustrating the relationship between *z*, *w*, and *z*/*w*

,이 시스템은 직관적 보인다. 그러나 결과적
와트/ 항상 ( F/ F 0/N) 0과 1 사이의 부동 소수점 값이며, 따라서 단일 채널로 표현 될 수 Z로서 조직.

두 번째 중요한 메모 : 깊이 버퍼는 비선형입니다. 즉, 근거리 및 원거리 자르기 기준면 사이의 개체가 깊이 버퍼의 0.5에 아무데도 근접하지 않습니다. 위에 표시된 것처럼 깊이 버퍼에서 0.999의 값과 상관 관계가 있습니다. 보기에 따라 좋거나 나쁠 수 있습니다. 깊이 버퍼가 더 자세한 클로즈업 (있는 그대로)이거나 전체적으로 세부 사항을 제공하기를 원할 수 있습니다 (그렇지 않은 경우).

TL; DR :

  • 넌 분할 와트 의해 Z 그래서 그것은 항상 범위 [0, 1].
  • W은 카메라에서 단편까지의 거리입니다.
+4

정말이 답변에 동의하지 않습니다. 질문은 순수 수학적 문제와 관련이 있습니다. 여기서 설명하는 것은 OpenGL 및 Z 버퍼 알고리즘 구현 세부 정보 (깊이 버퍼)입니다. –

+0

NDC의 z는 [0, 1]이 아닌 [-1, 1] 범위 내에 있습니다. – SnappleLVR