2012-04-27 4 views
3

버텍스 쉐이더에서 퍼스펙티브 매트릭스를 사용할 때 w로 나눌 코드를 작성해야합니까? 아니면 나중 단계에서 자동으로 수행됩니까?Perspecitve가 버텍스 쉐이더로 나눕니까?

내 질문에 대한 이유는 내가 사용 버텍스 쉐이더를 많이 본 것입니다 :

의 w 구성 요소 벡터를 분할 이후의 단계가있는 경우 의미가
gl_Position = matrix * pos; 

.

gl_Position = matrix * pos; 
gl_Position = gl_Position/gl_Position.w; 

되어 올바른 하나는 다른 설정이 누락 될 수있는 두 번째 예 :

그러나 나는 내 버텍스 쉐이더에서 다음 사용 때까지 일 없었어?

다른 방법을 넣으십시오 : OpenGL Vertex transformation (첫 번째 이미지)에 표시된 단계 중 버텍스 쉐이더에 쓸 필요가있는 것은 무엇입니까?

저는 ModelView와 Projection 매트릭스가 거기에 속해 있는지 (또는 둘의 병합) 있는지 알고 있습니다. 뷰포트 변환은 버텍스 쉐이더의 일부가 아니지만, divide by w은?

내 설정은 x/y/z의 좌표가 [-1 1] 이내 인 간단한 삼각형입니다.

원근감 행렬은 z = -1에서 -10 =, x = [- 1,1], y = [- 1,1]에 좌표를 투영한다고 가정합니다.

x, 0, a, 0 
0, y, b, 0 
0, 0, c, d 
0, 0, 1, 0; 

마지막 I는 = P * T는 번역 인 T (매트릭스 최종 매트릭스 생성 : 행렬 P하려면

x = 2.0f * zNear/(xMax - xMin); 
y = 2.0f * zNear/(yMax - yMin); 
a = -(xMax + xMin)/(xMax - xMin); 
b = -(yMax + yMin)/(yMax - yMin); 
c = (zFar + zNear)/(zNear - zFar); 
d = -(2.0f * zFar * zNear)/(zNear - zFar); 

:

-1.0 0.0 0.0 0.0 
0.0 -1.0 0.0 0.0 
0.0 0.0 -1.2 -2.2 
0.0 0.0 1.0 0.0 

그것은 의해 생성 된 0,0, -2)

나는 CPU에서 계산을 시도했지만 예상 결과를 생성하는 것으로 나타 났지만, 나도 수동으로 w로 나눕니다.

업데이트 : 해결하지만 난 (곱하기 -1) 행렬의 모든 구성 요소를 부정하고 지금은 작동

을 이해 필요. 위 예제는 또한 양과 음의 z 좌표를 투영 평면에 투영 할 때 문제가 발생했습니다.이 좌표는 또한이 변경으로 해결되었습니다.

이 변경으로 인해 해결 된 모든 참조 또는 설명은 환영합니다.

+0

나는 그 방정식을 어디서 얻었는지 아직 확실하지 않지만 gluPerspective를 보면 'd'값은 사용하는 것과 정확히 일치하지 않습니다. – Tim

+0

수식은 처음부터 알 수없는 위의 행렬로 처음부터 파생되었습니다. – hultqvist

답변

4

꼭지점 쉐이더에서 원근감을 나눌 필요가 없습니다. 나중에 파이프 라인에서 자동으로 수행됩니다.

작동하지 않는 경우 일부 코드를 표시하거나 문제를 자세히 설명해 주실 수 있습니까? 나는 그것이 당신에게 영향을 미치고 있다는 것에 놀랐습니다.

+0

잘 아는 것이 중요합니다. 그런 다음 내 문제를 "해결"하지 말고, 구성에 대한 예제를 추가했습니다. – hultqvist

+1

@phq -이 문장은 'z = -1부터 -10에서 z = -1'까지 혼란 스럽습니다. znear/zfar 인수는 무엇입니까? gluPerspective 또는 이와 동등한 방법으로 생성 했습니까? 원근감 나누기 전에 클리핑이 수행되므로, 수동으로 나눌 때가 아닌 비 - 나누기 예제에서 다각형이 클리핑된다는 것이 유일한 설명 일 수 있습니다. – Tim

+0

위 코드를 직접 작성하려고합니다. z- 범위 [-1, -10]은 [1, -1]에 매핑되고 투영 지점은 z = -1에서 z 축에 수직입니다. – hultqvist

관련 문제