2016-11-12 3 views
0

저는 Unity 용 Google GVR SDK의 렌즈 보정 쉐이더 코드를보고 있었으며 뷰 공간 위치의 z 구성 요소 (UNITY_MATRIX_MV, UNITY_MATRIX_MVP의 원근감 변환없이)의 사용과 관련하여 저의 머리를 긁어 왔습니다. undistort() 함수 (간단한 변종의 하나) :Google VR 렌즈 보정에서 깊이를 사용 하시겠습니까?

우리가 화면을 통해 볼 렌즈에 의해 적용됩니다 왜곡을 상쇄하기 위해 2D 화면 공간에서 렌더링 된 이미지를 워프 할 이해의 나 감안할 때
float r2 = clamp(dot(pos.xy, pos.xy)/(pos.z*pos.z), 0, _MaxRadSq); 
pos.xy *= 1 + (_Undistortion.x + _Undistortion.y*r2)*r2; 

, 무엇을 지구상에서 우리는 반경 (?)을 선형 깊이 (pos.z) 제곱으로 나누고 있습니까? 저는 이것을 원근법으로 w로 나누는 대신에 생각할 수 있습니다. 그렇다면 z 구성 요소의 제곱으로 나누기를 원하는 이유는 무엇입니까? (단순히 z 또는 w로 나누는 것보다 어떻게 더 정확합니까?)

답변

0

이것은 일반적인 최적화의 결과이므로 뒷모습에서 약간 바보 인 느낌을줍니다.

분할은 일반적인 원근법 분할입니다 (단, 깊이 버퍼/컬링에 사용되는 z 좌표는 선형으로 두어야하며 적절한 깊이 보간을 보장하려면 w가 1.0이어야 함). 계산을 재구성하면 쉐이더 사이클 및/또는 정확도가 떨어질 수 있습니다.

이 코드는 pos.z를 먼저 pos.x로 나눈 다음, pos.xy의 내적을 취하여 2D 화면 공간에서 길이를 제곱 한 다음 (예 : 클램핑 등) pos0을 단축하는 것과 같습니다.)