I
I
IliaNeverov2020-11-21 18:01:45
Qt
IliaNeverov, 2020-11-21 18:01:45

What is the difference between mvpmatrix and those that are set separately and should they be connected (separately) and in what cases?

What is the difference between mvpmatrix(m_shaderProgramm.setUniformValue("MVPMatrix", m_projectionMatrix * modelViewMatrix);) and those that are set separately and should they be connected (separately) and in what cases?

vertex shader
attribute vec4 a_position;
attribute vec2 a_textcoord;


uniform mat4 MVPMatrix;
uniform mat4 ModelMatrix;
uniform mat4 ViewMatrix;
uniform mat4 Projectionmatrix;


varying vec2 TexCoord;

void main(void)
{
    gl_Position = MVPMatrix * a_position;
    TexCoord = a_textcoord;
}


mainwindow.cpp
void MainWindow::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    QMatrix4x4 modelViewMatrix;
    modelViewMatrix.setToIdentity();
    modelViewMatrix.translate(0.0f, 0.0f, -5.0f);
    modelViewMatrix.rotate(m_rotation);

    m_texture->bind(0);

    //m_shaderProgramm.bind();
    m_shaderProgramm.setUniformValue("MVPMatrix", m_projectionMatrix * modelViewMatrix);
    m_shaderProgramm.setUniformValue("Texture", 0);


    // Bind buffers
    m_vertexBuffer.bind();
    m_indexBuffer.bind();

    int offset = 0;

    int location = m_shaderProgramm.attributeLocation("a_position");
    m_shaderProgramm.enableAttributeArray(location);
    m_shaderProgramm.setAttributeBuffer(location, GL_FLOAT, offset, 3, sizeof(VertexData));

    offset += sizeof(QVector3D);

    location = m_shaderProgramm.attributeLocation("a_textcoord");
    m_shaderProgramm.enableAttributeArray(location);
    m_shaderProgramm.setAttributeBuffer(location, GL_FLOAT, offset, 2, sizeof(VertexData));



    glDrawElements(GL_TRIANGLES, m_indexBuffer.size(), GL_UNSIGNED_INT, 0);

}

Answer the question

In order to leave comments, you need to log in

1 answer(s)
E
Evgeny Shatunov, 2020-11-21
@IliaNeverov

For a better understanding of the material, you should study at least this article .

In short
ModelMatrix - это матрица преобразования локального пространства геометрии конкретного объекта.
Внутри этого локального пространства геометрия объекта расположена относительно центра пространства. Чтобы геометрию модели отобразить в каком-либо целевом пространстве, необходимо произвести отображение локального пространства модели в целевое пространство. Именно таким отображением является ModelMatrix.
ViewMatrix - матрица отображения любого внешнего пространства в пространство вида - пространство взора наблюдателя. Наблюдатель (камера) воспринимает объекты только внутри своего собственного локального пространства. Чтобы наблюдатель мог увидеть объект, объект необходимо отобразить из его родного пространства в пространство вида камеры, где он или попадет в область проекции, или не попадет.
Projectionmatrix - матрица отображения видового пространства в пространство проекции вида. Фактически это отображение выполняет проецирование некоторого участка видового пространства на плоскость. Именно отображенная таким образом геометрия становится видимой при презентации кадра.
Каждый объект сцены находится и анимируется внутри своего локального пространства. Чтобы объект на сцене встал в положенное ему место, его геометрия отображается из своего локального пространства в глобальное пространство сцены с помощью своей ModelMatrix.
Чтобы сцена стала видна для камеры, всю ее геометрию требуется отобразить в пространство вида камеры с помощью матрицы ViewMatrix.
Чтобы часть пространства вида камеры попала в область презентации кадра, всю геометрию видового пространства нужно отобразить в пространство проекции с помощью матрицы Projectionmatrix.
При этом важно заметить, что матрицы Projectionmatrix и ViewMatrix уникальны для камеры, а вот матрицы ModelMatrix уникальны уже для каждого объекта отдельно.

Mapping between spaces is performed through the operation of multiplying the position in the original space by the space transformation matrix. If we approach this task head-on, then displaying each position will require 16 multiplication operations on real numbers.
In total, at least three consecutive geometry mappings are required to fill the frame presentation area, which will mean 48 multiplication operations for each position of the displayed geometry.
Given that Projectionmatrixthe ViewMatrixframe presentation process is unchanged, the cost of 48 operations for each position looks like waste. If, before the presentation, the view space itself is mapped to the projection space, i.e. multiply ViewMatrixandProjectionmatrixin the correct order, then with the help of the resulting matrix, the viewProjectionMatrixnumber of operations per position can be reduced to 32.
If, however, the mapping of the local model space itself into the presentation space through matrix multiplication viewProjectionMatrixand ModelMatrixin the correct order, then thanks to the resulting matrix, the MVPMatrixnumber of operations per position will decrease to initial 16.
Thus, matrices viewProjectionMatrixand MVPMatrixsimply allow to reduce the complexity of the presentation of the frame. However, during the presentation, it may be necessary to determine the position of the geometry in some intermediate space, therefore, in addition to MVPMatrixthe shader, it is customary to give both ModelMatrix, and camera matrices.
Each matrix has its own meaning. And ifMVPMatrixis undoubtedly always needed, then any other matrix should be added to the shader only on the basis of a meaningful need. The GPU registers for a shader are not rubbery and can get clogged with redundant data very quickly. In addition, the less data is transferred to the shader on each frame, the faster the frame presentation is performed.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question