OpenGL转换不适用于GLM矩阵

时间:2018-10-20 00:30:02

标签: c++ opengl glsl

我正在使用learningopengl教程以及在“转换”一章中学习OpenGL。我了解他所做的一切以及背后的理论(数学)。但是,在尝试练习我的对象时却没有显示,我复制了他的代码并将其粘贴并仍然没有改变!

这是我的顶点着色器:

#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 :(得分:1)

您必须初始化矩阵变量glm::mat4 transform

glm API documentation是指The OpenGL Shading Language specification 4.20

  

5.4.2向量和矩阵构造器

     

如果向量构造函数只有一个标量参数,它将用于将构造的向量的所有分量初始化为该标量的值。 如果矩阵构造函数只有一个标量参数,则它将用于初始化矩阵对角线上的所有分量,并将其余分量初始化为0.0。

这意味着,可以通过单个参数1.0来初始化一个单位矩阵:

glm::mat4 transform(1.0f);