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矩阵的主要内容,如果未能解决你的问题,请参考以下文章
3D 空间中的 OpenGL 2D 文本 [C++/GLM] 矩阵乘法