2014-03-01 3 views
1

OpenGL 튜토리얼을 따르고 있습니다. 튜토리얼 4에서는 OpenGL에 두 개의 "객체"를 전송하기 위해 사이드 "프로젝트"로 제안했으며 저자는 하나만 렌더링했습니다 전에 개체. 구체적으로 그는 다음과 같이 질문합니다.다중 모델뷰 행렬

큐브와 삼각형을 다른 위치에 그립니다. 메인 루프에서 2 회 그리기 호출을하려면 2 개의 MVP 행렬을 생성해야하지만 1 개의 셰이더 만 필요합니다.

우리는이 같은 MVP 행렬을 정의
GLuint MatrixID = glGetUniformLocation(programID, "MVP"); 
glm::mat4 Projection = glm::perspective(90.0f, 4.0f/3.0f, 0.1f, 100.0f); 

// Camera matrix 
glm::mat4 View = glm::lookAt(
          glm::vec3(0,0,3), // Camera is at (4,3,3), in World Space 
          glm::vec3(0,0,0), // and looks at the origin 
          glm::vec3(0,1,0) // Head is up (set to 0,-1,0 to look upside-down) 
         ); 
glm::mat4 Model = glm::mat4(1.0f); 
glm::mat4 MVP = Projection * View * Model; 

는 지금은 하나의 MVP 행렬은 개체 당 사용되는 것으로 알고 있습니다. 하지만 몇 가지 질문이 있습니다.

  1. 각 개체에 대해 MVP 행렬을 어떻게 만듭니 까? 모든 개체에 대해보기 및 모델 행렬을 다시 만들어야합니까 (IE는 각 개체에 대해 새 개체 지정)?

  2. 나는 glm::lookAt이 "카메라"종류로 사용되었다고 생각했기 때문에 각 객체에 대해 새로운 "카메라"를 만들지 않아도됩니다.

  3. Model 매트릭스는 무엇을합니까? 저자는 지금은 단위 행렬이라고 말하지만, 100을 말하도록 바꾸면 아무 일도 일어나지 않습니다! 나는 Model 행렬이 모델이 렌더링 된 곳을 정의한 행렬이라고 생각했지만 View 행렬을 수정하지 않고 모델이 렌더링 된 위치를 변경할 수는 없습니다.

답변

1

일반적으로 "카메라"당 하나의 투영 및 하나의보기 행렬을 사용합니다. 뷰 매트릭스는 기본적으로 카메라의 위치와 방향을 나타내며 프로젝션 매트릭스는 실제 카메라의 "렌즈"처럼 어떤 방식 으로든 카메라의 속성 (시야, 애스펙트 등)을 나타내지 만 늘이지 않습니다 그 비유는 너무 멀리).

일반적으로 모델 매트릭스는 일부 글로벌 "세계 cooridnate 시스템"에 모델을 배치하는 데 사용됩니다. 따라서 객체 당 모델 행렬이 필요하므로 각 객체를 독립적으로 배치 할 수 있습니다.

세계 코디앤테 시스템이 전혀 필요하지 않습니다. 결과 그림에서 중요한 것은 카메라에 상대적으로 객체를 배치하는 방법입니다. 즉, ModelView가 그림에 입력하는 방식입니다. 모델 및 뷰 변형의 구성 요소로, 객체 공간에서 카메라 상대적인 시각 공간으로 직접 이동하여 무시합니다. 어떤 "세계 공간".

이 경우 프로젝션 매트릭스와 더 결합하여 오브젝트 공간에서 클립 공간으로 직접 이동할 수 있습니다.

알 수 있듯이 MVP 매트릭스는 구성되는 고유 매트릭스 중 하나라도 변경되면 변경해야합니다. 이론적으로 객체 당 MVP을 미리 계산할 수 있습니다.하지만 카메라가 움직일 수 있고 모든 MVP 행렬을 다시 계산해야하므로 여기에 저장하는 것이 많지 않으므로 대개 완료되지 않습니다. 따라서 일반적으로이 행렬을 개별적으로 유지하고 그리기 호출 직전에 이들을 곱합니다.

모델 행렬의 기능은 무엇입니까? 저자는 지금은 단위 행렬이라고 말하지만, 100을 말하도록 바꾸면 아무 일도 일어나지 않습니다!

"매트릭스를 100으로 변경 하시겠습니까?" 위의 코드 조각에서 모델 행렬이 실제로 사용되고 행렬 MVP에 영향을주는 것을 볼 수 있습니다. 그러므로 변경하는 것은 효과가 있어야합니다 - 물론 당신이 변화하는 것에 따라. 그냥

glm::mat4 Model = glm::mat4(100.0f); 

에 선

glm::mat4 Model = glm::mat4(1.0f); 

을 변경 한 경우 그것은 실제로 observeable 변화로 이어질하지 않을 것입니다. 다른 클립 공간 좌표를 얻을 수 있지만 차이점은 서로를 취소하고 생성 된 이미지는 동일합니다. 그것은 동질적인 좌표가 어떻게 작동하는지에 달려 있으며, 전적으로 다른 문제입니다.