2017-03-19 11 views
1

나는 스텐실 조명 쉐이더에 대한 위치를 재구성하고있다. (- 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)를 사용하여뿐만 아니라 다른 선형화을 시도했지만 아무도 일하지.

1 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 "은 첫 번째 이미지 (카메라를 움직일 때 안정)를 제공하는 반면 원래의 기능은 두 번째 이미지를 제공합니다 (카메라를 움직일 때 매우 불안정합니다).

enter image description here enter image description here

+1

NDC의 Z가 -1에서 1 대신 0에서 1로 변하기 때문에 짐작할 수 있습니다. –

답변

1

가 VULKAN가 깊이 범위를 사용하여 [0, 1] (실제로는 또한 Y 축 대칭) 대신의 OpenGL은 [-1, 1].당신이 지금처럼

  • 또는으로 투영 행렬을 전치 승산을 곱하여, OpenGL의 방식을 준수하기 위해 쉐이더에서 NDC Z를 수정 : 당신은 OpenGL을 같은 동작을 얻기 위해 두 가지 옵션이 있습니다 매트릭스 1.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 1.0

은 자세한 내용은 https://matthewwellings.com/blog/the-new-vulkan-coordinate-system/에서보세요. Vulkan 사양 (https://www.khronos.org/registry/vulkan/specs/1.0-wsi_extensions/html/vkspec.html#vertexpostproc-clipping)에도 자세한 내용은 있지만 명확하게 설명하지는 않았습니다.

+0

감사합니다. 그의 설명에 많은 도움이되었지만 이상한 문제가 있습니다. 여전히 진행 중이다. [1,1]에서 부정을 사용하지 않고 그 행렬을 사용하면 효과가 있지만, 거꾸로 y가됩니다. 그러나 그 부정으로 나는 결과를 낼 수 없다. 화면은 항상 모든 것이 버려진 것처럼 검은 색으로 남아있다. – Aedoro

+0

카메라 방향이 틀릴 수 있습니까? 또한, 다소 관련이있는 baldurk의 renderdoc (https://renderdoc.org)은 이러한 문제를 디버그하는 데 절대적으로 훌륭한 도구입니다. 어쩌면 무슨 일이 일어나는지 알아낼 수 있습니다. – skalarproduktraum

+0

아픈 저것을 봐, 그리고 밖으로 문제를 거꾸로 알아낼 때까지 그냥 내 위로 벡터 아래쪽으로 가리킨 다음 작동합니다. – Aedoro