2011-11-08 5 views
2

나는 내부적으로 버텍스 - 프래그먼트 쉐이더 쌍에서 어떤 일이 일어나는지 알아 내려고합니다. 더 구체적으로 나는 CPU에서 깊이 값을 비교하려고합니다. 이 심도 값은 쉐이더에 의해 계산되며 gl_FragCoord.z ​​값에 해당합니다. 내가 알고있는 것은 깊이 출력이 [0,1] 범위이며 선형이 아니라는 것입니다. 그렇다면 누군가가 버텍스 쉐이더에 깊이를 주입하고 프래그먼트 쉐이더에서 그것을 읽는 것 사이에 주어진 깊이 값에 어떤 일이 일어나는 지 알고 있습니까? OpenGL에서 깊이를 [0,1] 범위로 변환하는 방법은 무엇입니까?OpenGL 쉐이더 파이프 라인 깊이 계산

미리 감사드립니다.

답변

1

간단한 OpenGL 렌더러에서 깊이 값은 버텍스 셰이더의 행렬 변환에 의해 생성됩니다. 내 경우에는, 내 기본 버텍스 쉐이더는 다음을 수행합니다

mat4 mvpMatrix = ProjectionMatrix * ViewMatrix * ModelMatrix; 
vec4 pos = vec4(ObjectPosition.x, ObjectPosition.y, ObjectPosition.z, 1.0); 

gl_Position = mvpMatrix * pos; 

내 응용 프로그램에 의해 제어되는 입력의 역할을 세 행렬을; 나는 그들에 대한 완전한 통제권을 가지며 내가 원한다면 수동으로 과정을 진행할 수있다.

요약 : 어떤 매트릭스를 버텍스 쉐이더에 전송하고 계산합니까? 변환은 버텍스 쉐이더 자체에서 발생하며, 가장 중요한 매트릭스는 아마도 ProjectionMatrix입니다. 뷰포트에 대한 지식이 있어야 (적어도 가지고 있어야하기 때문에) 매핑을 [0,1]로 처리합니다. 이 만족하면

1

행렬 변환을 적용하면, 정점 [v]은 표준 뷰 볼륨이다

-1 <= x' <= 1, -1 <= y' <= 1, -1 <= z' <= 1 (where: x' = v.x/v.w, etc.) 

정규화 범위 [0 :

- v.w <= v.x <= v.w, - v.w <= v.y <= v.w, - v.w <= v.z <= v.w 

(w)에 의해 투시 분화 이후 , 1]은 다음과 같이 주어진다.

depth = 0.5 * (z' + 1.0)