나는 스텐실 조명 쉐이더에 대한 위치를 재구성하고있다. (- cameraPos vertexPos) 이 내가 세계 공간 뷰 벡터를 얻을 수있는 빛의 구형 근사치에 대한 정점을 의미합니다. 눈 (촬영 방향)의 세계 공간 Z 축
viewZDist : 깊이 버퍼를 보유 - eyeZAxis (cameraPos를 vertexshader에 vertexPos 보간) 세계 공간 뷰 선 :VULKAN 깊이 버퍼 위치 재건
vec3 construct_pos_ws(float depthBufferZ)
{
vec3 viewRay = normalize(gInVert.vRayWs);
float viewZDist = dot(gInFrame.eyeZAxis, viewRay);
vec3 relPoint = viewRay * linearDepth(depthBufferZ)/viewZDist;
return gInFrame.eye + relPoint;
}
vRayWs를 다음의 코드는 다음과 같다 카메라 표면까지의 거리 평행하지만, 우리는 거리가, 이것이 우리가 물체를 볼 수있는 각도를 차지해야합니다.
문제 wikipedia: z-buffering에 기초하여 I 사용하는 선형 함수로이다 은 (I는 S = 2^D-1을두고,이 부분은 적용되지 보인다).
float linearDepth(float z_b) {
float f = z_far;
float n = z_near;
return (-f * n/(z_b (f - n) - f));
}
이 작동하지만 float n = z_near * 2
를 사용하는 대신에 제공하지 않습니다 (겉보기) (이전의 대답은 수정에 가까운 모습 때문에 난 그냥 무작위로, 시도) 올바른 결과.
나는 위키 피 디아 페이지에있는 모든 나무의 변종의 역수 (아래 3)를 사용하여뿐만 아니라 다른 선형화을 시도했지만 아무도 일하지.
실제 질문 : 그래서 무슨 일이 일어나고 있는지? 왜 2 배의 곱셈이 정확한 답을주는 것 같습니까? 위키 피 디아에서 수식을 사용하지 않는 것 때문에 어떤 수식이 깊이 버퍼에 쓰는 데 어떤 공식을 사용합니까?
마지막으로, 완성도, 투영 행렬 구성은 다음과 같이이다 :
float yScale = 1.0f/tan(fov/2.0f);
float xScale = yScale/aspect;
float nearmfar = z_near - z_far;
Matrix m = {
xScale, 0, 0, 0,
0, yScale, 0, 0,
0, 0, (z_far + z_near)/nearmfar, -1,
0, 0, 2 * z_far * z_near/nearmfar, 0
};
또한
, 나는 정확한지 알 수 있습니까 방법 :
변경 사항을 사용하여 렌더링 "위치 모드 1 "은 첫 번째 이미지 (카메라를 움직일 때 안정)를 제공하는 반면 원래의 기능은 두 번째 이미지를 제공합니다 (카메라를 움직일 때 매우 불안정합니다).
NDC의 Z가 -1에서 1 대신 0에서 1로 변하기 때문에 짐작할 수 있습니다. –