이 이상한
아니하다. 고정 기능은 프로그래머블 파이프 라인으로 대체되었으므로 원하는대로 변환을 설계 할 수 있습니다.
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와 같은 렌더링 엔진을 사용하는 것이 더 나을 가능성이 있습니다.
출처
2012-11-30 14:45:04
Kos
어쨌든 코드를 다시 코딩해야하기 때문에이 바보 같은 modelview 개념을 없애고 두 개의 별도 매트릭스로 나누는 것도 완벽한 순간입니다. – Calvin1602
@ Calvin1602는 "개념"이 아닌 최적화입니다. – Kos
GLM을 사용하면 분명히 순조로운 전환이됩니다. 나는 호환성 프로파일을 완전히 피하는 중요성을 강조했다. 특히 성능과 이식성이 뛰어난 코드 기반을 원하면 더욱 그렇습니다. – Grimmy