2012-11-30 2 views
4

I 단지 이것을 읽어.OpenGL의 매트릭스 스택은 더 이상 사용되지 않습니다?

"OpenGL은 표준 행렬을 이용하여 변형 및 돌기 좌표 관리 지원 를 제공하는 코어 그러나 OpenGL은 4.0, 매트릭스 스택을지지하는 기능 모두 (GL_MODELVIEW 및 GL_PROJECTION)를 스택 그러므로 우리는 보통의 변환 및 투영 행렬에 대해 지원을 제공 한 다음이를 쉐이더에 전달해야합니다. "

이상한 점이있어서 모델 뷰 및 프로젝션 매트릭스를 지금 어떻게 설정합니까? OpenGL 앱에 을 작성한 다음 버텍스 쉐이더의 버텍스에 행렬을 곱해야합니까?

답변

10

이 이상한

아니하다. 고정 기능은 프로그래머블 파이프 라인으로 대체되었으므로 원하는대로 변환을 설계 할 수 있습니다.

OpenGL 앱에서 생성 한 다음 정점 셰이더의 정점에 행렬을 곱해야합니까?

그냥 행렬 스택의 이전 OpenGL을 한 쌍처럼 일하는 것이 뭔가를하려는 경우, 다음과 같은 예를 들어, 정점 셰이더 보이게 할 것 :

in vec4 vertexPosition; 
// ... 

uniform mat4 ModelView, Projection; 

void main() { 
    gl_Position = Projection * ModelView * vertexPosition; 
    // ... 
} 

그리고 (여기 ++ C로 표시) 해당 클라이언트 크기의 코드가 될 것이다 (당신은, 물론 약간 있음을 최적화 할 수 있습니다) 같은 :

std::stack<Matrix4x4> modelViewStack; 
std::stack<Matrix4x4> projectionStack; 

// Initialize them by 
modelViewStack.push(Matrix4x4.Identity()); 
projectionStack.push(Matrix4x4.Identity()); 

// glPushMatrix: 
stack.push(stack.top()); 
    // `stack` is either one stack or the other; 
    // in old OpenGL you switched the affected stack by glMatrixMode 

// glPopMatrix: 
stack.pop(); 

// glTranslate and family: 
stack.top().translate(1,0,0); 

// And in order to pass the topmost ModelView matrix to a shader program: 
GLint modelViewLocation = glGetUniformLocation(aLinkedProgramObject, 
               "ModelView"); 
glUniformMatrix4fv(modelViewLocation, 1, false, &modelViewStack.top()); 

.translate()과 같은 작업을 지원하는 Matrix4x4 클래스가 있다고 가정했습니다. GLM과 같은 라이브러리는 대응하는 GLSL 유형처럼 동작하는 행렬 및 벡터의 클라이언트 측 구현은 물론 gluPerspective과 같은 함수의 구현을 제공 할 수 있습니다.


당신은 또한 OpenGL은 호환성 프로필을 통해 OpenGL을 한 기능을 계속 사용할 수 있지만,이 (당신이 다음의 OpenGL의 잠재력을 사용하지 않는)하지 않는 것이 좋습니다.

OpenGL 3 (및 4)의 인터페이스가 OpenGL 1보다 낮은 수준입니다. 위 코드가 너무 많은 코드라고 생각하면 Irrlicht와 같은 렌더링 엔진을 사용하는 것이 더 나을 가능성이 있습니다.

+1

어쨌든 코드를 다시 코딩해야하기 때문에이 바보 같은 modelview 개념을 없애고 두 개의 별도 매트릭스로 나누는 것도 완벽한 순간입니다. – Calvin1602

+1

@ Calvin1602는 "개념"이 아닌 최적화입니다. – Kos

+0

GLM을 사용하면 분명히 순조로운 전환이됩니다. 나는 호환성 프로파일을 완전히 피하는 중요성을 강조했다. 특히 성능과 이식성이 뛰어난 코드 기반을 원하면 더욱 그렇습니다. – Grimmy

4

매트릭스 스택은 더 이상 사용되지 않는 고정 함수 파이프 라인의 일부입니다. 호환성 확장을 통해 여전히 이전 기능에 액세스 할 수 있지만 그렇게하지 않아야합니다.

매트릭스 및 카메라에 대한 유용한 자습서가 있지만 선호하는 것은 this one.입니다. 매트릭스를 쉐이더에 보내고 매트릭스와 함께 정점을 곱하십시오.

+0

링크가 죽었습니다. 새로 보내 주실 수 있습니까? – Krythic

+1

@Krythic Of couse, 업데이트되었습니다! –

+0

정말 고맙습니다.=) – Krythic

관련 문제