OpenGL转换不使用GLM矩阵

Posted

技术标签:

【中文标题】OpenGL转换不使用GLM矩阵【英文标题】:OpenGL Transformations not working using GLM matrix 【发布时间】:2018-10-20 00:30:02 【问题描述】:

我正在使用 learnopengl 教程和转换章节学习 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);

当我从顶点着色器中的乘法中删除变换时,一切正常

【问题讨论】:

该代码旨在提供旋转形状。 “工作正常”是指您可以看到该形状但不能移动,对吗?这意味着包含时的变换矩阵不正确。尝试一个更简单的。 你必须初始化transform: glm::mat4 transform(1.0f); - 见Why is the sprite not rendering in OpenGL?。 Why is the sprite not rendering in OpenGL?的可能重复 尝试一步一步的东西。开始没有纹理然后添加它。另外glDrawElements 是学习目的代码的错误选择。 【参考方案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);

【讨论】:

救命稻草,谢谢!我已经搜索过 glm::mat4 默认构造函数做了什么,我发现它将垫子初始化为身份。不过还是谢谢

以上是关于OpenGL转换不使用GLM矩阵的主要内容,如果未能解决你的问题,请参考以下文章

使用 GLM(旋转)为 OpenGL 创建变换矩阵

旋转矩阵的问题(openGL/glm)[关闭]

现代 OpenGL:VBO、GLM 和矩阵堆栈

3D 空间中的 OpenGL 2D 文本 [C++/GLM] 矩阵乘法

OpenGL 数学库 GLM 投影矩阵公式 glm::perspective 已经抛弃角度的使用,转为使用弧度

C ++ / OpenGL glm无法将矩阵插入着色器中的统一