2014-09-13 1 views
0

OpenGL을 사용하여 개체를 그리는 방법을 이해하려고합니다. 질문은 간단하지만 여전히 어디서나 명확한 대답을 찾을 수 없습니다 (또는 완전히 바보입니다 :)). 이 문제를 설명하겠습니다.예기치 않은 z 축 방향 (보기가없고 투영 행렬이 없음)

1) 화면에 2 개의 삼각형을 넣기 만하면됩니다. 삼각형 '는 다음과 같이 좌표 (x, y, z, w)이다 :

Triag1 = { {0, 0, -0.5, 1} , {1, 0, -0.5, 1}, {0, 1, -0.5, 1} } // a bigger one 
Triag2 = { {0, 0, 0.5, 1} , {0.5, 0, 0.5, 1}, {0, 0.5, 0.5, 1} } // a smaller one 

2) 사용이나 뷰 있지 않다 없으며 투영

3) I가 통과하고있어 변형'디폴트 '색상 각 삼각형을 꼭지점 속성 중 하나로서 선택하고, 다양한 삼각형을 사용하여 프래그먼트 쉐이더로 간단하게 건너 뛸 수 있습니다. Triag1이 파란색이고 Triag2가 빨간색입니다

그물을 다루는 모든 자습서에서는 OpenGL에서 오른손 좌표계를 사용하고 Z 축은 '화면 밖'을 가리킨다 고합니다. 그래서, 내 개체의 각 z 좌표를 고려할 때, 그 뒤에 작은 빨간 삼각형과 큰 파란색 삼각형이 보일 것으로 기대합니다. 어떻게 그런 일이 일어나지 않는지. 큰 굵은 파란색 삼각형 만 볼 수 있습니다.

내 삼각형의 각 z 좌표를 바꿔 넣으면 (Triag1은 양의 z 좌표를 얻습니다. Triag2는 음의 z 좌표를 얻음) 예상 한 것을 봅니다. 그러나. 즉, 어떻게 든 Z 축은 화면 밖으로 빠져 나오지 않는다는 것을 의미합니다.

더 많은 경험이있는 사람이 내가 놓친 기본면을 설명해주세요.

P. GLUT, GLM 없음, 다양한 OpenGL 행렬 설정을 요구하지 않음. 전용 "GPU에 정점을 통과 - 쉐이더 프로그램을 활성화 - 것은 그리"그물 주위

답변

2

모든 튜토리얼 말을 OpenGL을 사용하는 오른쪽 손으로 좌표계하고 Z 축 점 '아웃 오브 스크린' . 그리고이 눈 공간의 규칙이기 때문에 정말 여기에 적용되지 않는 규칙 - 단지 관례

. 일반적으로, 카메라가 -z 방향을 따라 보이는 눈의 공간이 있습니다 (그리고 기능은 정확히 염두에두고 설계된 것입니다).

일반적인 투영 행렬은 또한 부작용으로 손잡이를 뒤집습니다. 그리고 gluPerspective(), glOrtho()glFrustum() 함수는 실제로 nearfar 매개 변수에 양수 값을 알리려고하지만 near 및 far 평면을 각각 z=-nearz=-far에 설정해야합니다. 따라서 GL의 클립 공간은 일반적으로 왼손잡이로 간주됩니다. 변환 행렬을 사용하지 않으므로 클립 공간을 직접 그립니다.

그러나 이것은 단지 다른 규칙이며 실제로 원할 경우 변경할 수 있습니다. 깊이 테스트 기능을 뒤집거나 glDepthRange()을 사용하여 뒤집을 수 있습니다. 결국, 그것은 당신에게 달려 있습니다. 그러나 보통 사람들은 GL 협약과 왼손잡이 클립 공간, NDC 및 창 공간을 고집합니다. 실제로 z = 0에서 가까운 평면을 가지며 창 좌표에서 z = 1에서 먼 평면을 갖는 것은 아주 직관적입니다.

+0

derhass, 답장을 보내 주셔서 감사합니다! –

+0

GLUT, GLM 및 기타 확장 기능을 사용하지 않는다는 점을 잊어 버렸습니다 (GLX는 제외하지만 3d와 아무런 관련이 없음). 좀 더 깊은 이해를 위해 모든 것을 '손으로'하려고 노력하고 싶습니다. glOrtho()와 glFrustum()에 대한 호출도 없었습니다. 그냥 원시 "GPU에 버텍스를 전달 - 쉐이더 프로그램을 가능하게 - 그립니다". 그래서 내가 제대로 설정했다면 아무것도 설정하지 않으면 NDC 공간이 기본적으로 왼손잡이입니까? –

+0

@PeterGlushkov : 예. NDC 공간에서 z = -1은 근거리 평면이고 z = 1은 원거리 평면입니다. – derhass