2015-02-02 1 views
0

나는 최근에 OpenGL이 xy뿐 아니라 z도 원근 분리를 수행함을 깨달았다.왜 Z가 perscpective division의 영향을 받습니까?

내 이해는 x /= w;y /= w;으로 충분합니다. 물론, 우리는 다른 투영 행렬이 필요합니다.

OpenGL이 z /= w;을 사용하는 이유는 무엇입니까? 짧은 거리에서는 z 버퍼를 더 정확하게 만들지 만 긴 버퍼에서는 z 버퍼를 덜 정확하게 만듭니다.

+0

정밀도가 그 하나의 이유입니다. 두 번째는 0과 1 사이에서 정규화 된 z 값을 얻는 것입니다. – BDL

+0

@BDL Z 값은이 분할을 사용하지 않고 행렬 만 사용하여 정규화 할 수 있습니다. 따라서 정밀도 만있는 것처럼 보입니다. (그런데, z 범위는'-1 : 1'입니까?) – HolyBlackCat

+0

예, -1 : 1. 죄송합니다. – BDL

답변

1

수학적으로 모든 구성 요소를 나누는 것이 올바른 방법입니다. 그런 식으로 화면 공간 z을 보간하여 보간하면 (위치 공간 데이터에 보간법 보간이 수행되지 않습니다. 이는 화면 공간에서 보간 된 것으로 가정하기 때문입니다). sceen 공간에서의 선형 보간은 물론 눈이나 물체 공간에서 이것을 보았을 때 비선형으로 보임을 의미합니다. 이는 단순히 이미지 평면에 평행하지 않은 객체를 의미합니다. 화면의 왼쪽으로 한 픽셀을 이동한다는 것은 거리에 따라 + 또는 -z를 따라 다양한 양을 의미합니다. 따라서 perspecitve는 실제로 z 축을 왜곡합니다. .

부작용은 Z 버퍼 정밀도가 근거리 평면에서 가장 높다는 것인데, 이는 실제로 대부분의 장면에서 좋은 점입니다.

깊이 테스트를 위해 "분할되지 않은"Z를 사용하는 것을 W buffer이라고합니다. 그러나 이것은 선형 보간을 더 이상 사용할 수 없다는 것을 의미합니다. 그러나 현대 GPU에서는 그리 큰 문제는 아닙니다.

+0

죄송합니다. 귀하의 답변을 완전히 이해하지 못했습니다. 원근법에 맞는 속성 보간에 z 분할이 필요하다는 의미입니까? – HolyBlackCat

+0

아니요. z에서 나누기를 할 때 화면 공간에서 결과를 선형 적으로 보간하고 보간 된 조각에 대해 정확한 깊이를 얻을 수 있다는 것을 의미합니다.이 경우 나누기를 수행하지 않을 경우 그렇지 않습니다. 원근감 변환은 3 차원 모두에서 작동하므로 원근감 나누기가 거리에 따라 (투시 변환 이전의) 시각 공간에서 다양한 이동량으로 매핑되고 화면 공간에서 한 단위가 왼쪽 또는 위 또는 멀리 이동합니다. x와 y (obvius가되어야 함)뿐만 아니라 z에서도 그렇습니다. – derhass

+0

그래, 거리가 커질수록 z 축척도 줄어 듭니다. 하지만 z 버퍼 정밀도를 제외하고 왜 필자가 필요합니까? 일종의 쉐이더 효과를 더 쉽게하려면? 선형 보간과 비선형 z 보간 사이의 유일한 차이점은 z 버퍼 동작입니다. – HolyBlackCat

0

투영 변환은 월드 스페이스에서 투영 공간으로 개체를 이동시키는 역할을합니다 (실제로 투영 공간 전에는 카메라 공간이되지만 범위에는 포함되지 않습니다).

시각적으로 모든 다른 공간은 -1에서 1로가는 입방체이며, 투영 공간은 가까운 평면이 Z0이고 원거리가 Z1 (또는 Z-1은 오른손 또는 왼손에 따라 다름) 인 피라미드 섹션입니다. 시스템). 따라서 z는 변형됩니다 (직교 투영이없는 경우). Z는 렌더링 파이프 라인에 들어가기 위해 가까운 비행기 뒤에있는 물체에 실제로 아무런 의미가 없기 때문에 Z는 0에서 1로갑니다.

자신과 Z 버퍼 정밀도에 대한 의견을 언급하셨습니다. 정밀도는 변경되지 않지만 투영 변환 후에는 먼 평면 근처의 물체와 가까운 평면 근처의 물체 사이에서 오브젝트 Z 델타가 작아집니다 (덜 환상적인 용어로는 물체 사이의 Z 축상의 거리 NearPlane 근처의 거리가 증가하는 반면, FarPlane 근처의 물체 사이의 Z 축상의 거리는 감소합니다.

가까운 평면과 원거리 비행기 거리를 줄이는 것이 때때로 Z를 수정하는 이유입니다. 싸움 : 두 비행기 사이의 거리가 짧아지면 멀리 떨어져있는 물체 사이의 거리가 줄어 듭니다.

+0

'z/= w;'가 왜 필요한지 아직 이해가되지 않습니다. 어쩌면 틀 렸지만,'z/= w;'나눗셈 없이는 원근법 변환이 가능하다고 생각합니다. – HolyBlackCat

+0

이제 나는 당신이 묻는 것을 얻습니다. :) 실제로 x, y, z뿐만 아니라 모든 속성이 나뉘어집니다. 이는 예를 들어, 텍스처 코디네이트. [here] (http://web.cs.ucdavis.edu/~amenta/s12/perspectiveCorrect)를 참조하십시오.pdf) – BDL

+1

@BDL 분할되지 않았으므로 'w'값을 사용하는 까다로운 보간입니다. – HolyBlackCat

관련 문제