Что такое gl_ModelViewMatrix и gl_ModelViewProjectionMatrix в современном OpenGL? - PullRequest
5 голосов
/ 18 сентября 2010

У меня есть этот код, который является контекстом "#version 330 core"

gl_Position =           PerspectiveViewMatrix(90.0, AspectRatio, 0.01, 1000.0  )


                        *    TranslationMatrix(0, 0, -4 -0.35*MouseWheel)        


                        *    RotationMatrix(MouseMovement.y, X_AXIS)        
                        *    RotationMatrix(-MouseMovement.x, Y_AXIS)    
                        *    RotationMatrix(float(Strafing*3), Z_AXIS)    


                        *    TransformationMatrix

                        *    in_Vertex;

Какая его часть - старая gl_ModelViewMatrix, а какая - gl_ModelViewProjectionMatrix? (Что такое gl_ProjectionMatrix, который использовался для создания ModelViewProjection?)

1 Ответ

6 голосов
/ 18 сентября 2010

Я не слишком знаком с GLSL 3.3, но держу пари, что PerspectiveViewMatrix (это даже встроенная функциональность?) Создает матрицу, которая заменяет старую встроенную gl_ProjectionMatrix

gl_ModelViewMatrix в целом является продуктом матрицы преобразования объекта в мировом пространстве и его собственного «локального» преобразования, поэтому его можно определить как продукт TranslationMatrix, RotationMatrix и TransformationMatrix.


Вам нужно отправить все матрицы в шейдер самостоятельно, например как униформа. Эти матрицы вам нужно построить самостоятельно (например, используя GLM ). Ленивый пример для матрицы проекции:

// in your app

std::array<GLfloat, 16> projection;

glMatrixMode(GL_PROJECTION);
glPushMatrix();
gluOrtho(...);
glGetFloatv(GL_PROJECTION_MATRIX, projection.data());
glPopMatrix();

glUniformMatrix4fv(glGetUniformLocation(ShaderProgramID, "ProjectionMatrix"), 1, GL_FALSE, projection.data());

// in vertex shader

uniform mat4 ProjectionMatrix;
in vec4 InVertex;

void main() {
    gl_Position = ProjectionMatrix * InVertex;
}
...