Преобразования OpenGL не работают с использованием матрицы GLM - PullRequest
0 голосов
/ 20 октября 2018

Я изучаю OpenGL, используя учебные пособия learnopengl и главу «Преобразования».Я понял все, что он сделал, и теорию (математику), стоящую за этим.Но, пытаясь попрактиковаться, мой объект не отображается, я скопировал его код и вставил его, но ничего не изменилось!

Вот мой вершинный шейдер:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;

out vec2 TexCoord;

uniform mat4 transform;

void main()
{
    gl_Position = transform * vec4(aPos, 1.0);
    TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}

Мой рендеринг:

// bind textures on corresponding texture units
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);

// create transformations
glm::mat4 transform;
transform = glm::rotate(transform, glm::radians((float)glfwGetTime()), glm::vec3(0.0f, 0.0f, 1.0f));

// get matrix's uniform location and set matrix
ourShader.use();
unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform));

// render container
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

когда я удаляю преобразование из умножения в вершинном шейдере, все отлично работает

1 Ответ

0 голосов
/ 20 октября 2018

Вы должны инициализировать матричную переменную glm::mat4 transform.

Документация glm API относится к Спецификация языка затенения OpenGL 4.20 .

5.4.2 Векторные и матричные конструкторы

Если в конструкторе векторов есть один скалярный параметр, он используется для инициализации всех компонентов построенноговектор к значению этого скаляра. Если в конструкторе матрицы имеется один скалярный параметр, он используется для инициализации всех компонентов по диагонали матрицы, а остальные компоненты инициализируются равными 0,0.

Это означает, чточто единичная матрица может быть инициализирована одним параметром 1.0:

glm::mat4 transform(1.0f);
...