GLM库简介

OpenGL没有内建矩阵运算方法,常用的第三方库为GLM。GLM是OpenGL Mathematics的缩写。作为一个header only库,GLM只要包括了相应的头文件就可以使用它提供的类和函数。GLM是C++语言编写的,故不适用于C语言工程。

头文件

  • GLM对于矩阵数据类型的定义位于glm/glm.hpp头文件中。
  • 生成变换矩阵的函数位于glm/gtc/matrix_transform.hpp头文件中。
  • 生成投影矩阵的函数位于glm/ext/matrix_clip_space.hpp头文件中。
  • 将数组转换成矩阵的函数位于头文件glm/gtc/type_ptr.hpp中。
  • glm::value_ptr函数位于头文件glm/gtc/type_ptr.hpp中

GLM常用数据类型

  • vec2 二维向量
  • vec3 三维向量
  • vec4 四维向量
  • mat2 二阶矩阵
  • mat3 三阶矩阵
  • mat4 四阶矩阵

GLM常用函数

  • glm::radians()
    角度制转弧度制,可应用于glm::rotate()中。
  • glm::translate()
    返回一个平移矩阵,第一个参数是目标矩阵,第二个参数是平移的方向向量。
  • glm::rotate()
    返回一个将点绕某个轴逆时针旋转一定弧度的旋转矩阵,第一个参数是弧度,第二个参数是旋转轴。
  • glm::scale()
    返回一个缩放矩阵,第一个参数是目标矩阵,第二个参数是在各坐标轴上的缩放系数。
  • glm::ortho(float left, float right, float bottom, float top, float zNear, float zFar);
    正交投影矩阵。前四个参数分别是视口的左、右、上、下坐标。第五和第六个参数则定义了近平面和远平面的距离。
  • glm::perspective(float fovy, float aspect, float zNear, float zFar);
    透视投影矩阵。第一个参数为视锥上下面之间的夹角,第二个参数为视口宽高比,第三、四个参数分别为近平面和远平面的深度。
  • glm::value_ptr()
    传入一个矩阵,返回一个数组。

GLM矩阵的默认构造

GLM库从0.9.9版本起,默认会将矩阵类型初始化为一个零矩阵(所有元素均为0),而不是单位矩阵。如果使用0.9.9及以上的版本,需要在声明矩阵时传入参数1,例如glm::mat4 mat(1.0f)。

向着色器中输入矩阵

glm::value_ptr函数

GLM的glm::value_ptr()函数可以返回一个数组,其中按列优先储存了矩阵的元素。例如:

#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <iostream>
#include <typeinfo>int main() {glm::mat4 trans(1.0f);trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0, 1, 0));//0  0  1  0//0  1  0  0//-1 0  0  0//0  0  0  1float *p = glm::value_ptr(trans);std::cout << typeid(p).name() << std::endl;for (int i=0; i < 16; i++) {std::cout << *p << ' ';p++;}std::cout << std::endl;return 0;
}
//输出结果:
//float *
//0 0 -1 0 0 1 0 0 1 0 0 0 0 0 0 1

我们可以用glm::value_ptr()搭配glUniformMatrix4fv函数向着色器传入矩阵:

glUniformMatrix4fv(glGetUniformLocation(ID, "name"), 1, GL_FALSE, glm::value_ptr(trans));
//ID为着色器程序的位置,glCreateProgram()的返回值
//name为自己在着色器中定义的uniform,如:uniform mat4 transform

glUniformMatrix4fv函数

void glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)

  • location: uniform的位置。
  • count: 需要加载数据的数组元素的数量或者需要修改的矩阵的数量。
  • transpose: 列优先矩阵传false,行优先矩阵传true。
  • value: 指向由count个元素的数组的指针。

GLSL中的向量*向量运算

需要注意的是,在GLSL中,vec4 * vec4是逐元乘法(component wise),例如:

vec4 a = vec4(1.0, 2.0, 3.0, 4.0);
vec4 b = vec4(0.1, 0.2, 0.3, 0.4);
vec4 c = a * b;
//c: vec4(0.1, 0.4, 0.9, 1.6)

OpenGL矩阵运算——GLM库的使用相关推荐

  1. 【OpenGL】glm库的配置

    下载glm库,可点击这里直接下载 下载完后解压一下,把整个glm文件夹复制到你的项目所在文件夹下,如下图所示. 这个文件是glm父文件夹,不是子文件夹,该文件夹下还有一个glm子文件夹 右击你的项目, ...

  2. opengl glm库 改变mvp矩阵 实现3D漫游

    上一篇glm来实现的mvp矩阵变换实现opengl渲染模型,讲到了如何利用glm库实现mvp矩阵,这篇主要讲解下,我们如何利用glm库的平移.旋转矩阵实现一个简单的3d漫游的效果. 原理 移动 cam ...

  3. OpenGL实用开源库 汇总

    https://blog.csdn.net/huawenguang/article/details/1393904 https://blog.csdn.net/hbtj_1216/article/de ...

  4. OpenGL-利用矩阵变换(缩放、旋转、位移),使用glm库

    目录 1. 矩阵知识总结 缩放 旋转 位移 2. glm使用方法 安装 使用 位移(使用translate函数) 旋转(使用rotate及radians函数) 缩放(使用scale函数) 在你的cpp ...

  5. 【OpenGL】使用OpenGL的GLU库绘制BSpline曲线

    [OpenGL]使用OpenGL的GLU库绘制BSpline曲线. 1.绘制目标 2.核心代码 3.运行结果 1.绘制目标 使用OpenGL的GLU库绘制BSpline曲线. 2.核心代码 /// T ...

  6. 【OpenGl】openGL 诸多库之间关系 及 环境配置

    [OpenGl]openGL 诸多库之间关系 及 环境配置 最近一直在学习OpenGL,但是看OpenGL编程指南不同版本之间使用一堆不同的库,概念名称全都混搅起来了,越看越糊涂,于是整理了一下Ope ...

  7. 有趣又好玩的glm库

    一.glm的优点 glm是一个发展了十年以上的数学库,这个库很不错.很多教材,书籍,资料大量使用glm,了解glm有助于阅读这些资料. 1.模仿glsl的接口 这个实在是非常方便理解和记忆,你不需要在 ...

  8. OpenGL编程指南3:GLUT:OpenGL使用工具库

    1.前言 我们知道的,OpenGL包含了很多的渲染函数,这些函数的设计目的就是独立与任何窗口系统或操作系统.因此,他并没有包含打开窗口或者从键盘或鼠标读取事件的函数.遗憾的是,如果连最基本的打开窗口的 ...

  9. 三阶矩阵的lu分解详细步骤_快速入门矩阵运算——开源库Eigen

    矩阵是数学中一个重要的工具,广泛应用于各种场景下的数值分析,例如,数字信号处理,图像处理等.我们如何在程序中使用矩阵进行运算呢?本文将为大家介绍一个开源的矩阵运算工具--Eigen. Eigen is ...

最新文章

  1. 网络编程学习笔记(gethostbyname2函数与IPv6支持)
  2. LeetCode:Two Sum
  3. SAP 电商云 Spartacus UI 的 checkout 场景中的串行请求设计分析
  4. apache启动失败_请检查相关配置.√mysql5.1已启动._1、Apache启动失败,请检查相关配置-百度经验...
  5. 查询已有链表的hashmap_面试官再问你 HashMap 底层原理,就把这篇文章甩给他看...
  6. 立竿见影地把你的 Python 代码提速7倍
  7. python中sklearn中的Imputer模块改动
  8. python中的模块与类
  9. 微课|中学生可以这样学Python(2.3.3节):内置函数zip()
  10. python获取绝对路径_Python 获取文件路径及文件目录
  11. java求字符串数组交集、并集和差集
  12. windows 游戏编程大师技巧(第二版)学习之路-1
  13. 微信公众平台登录 超详解 Springboot版
  14. cpu超线程优缺点_CPU有无超线程重要吗?i7 10700K与9700K对比测试
  15. 实习僧[shixiseng.com]爬虫实战笔记
  16. 2016年排名Top 100的Java类库——在分析了47,251个依赖之后得出的结论(16年文章)...
  17. Matter Commissioning
  18. 2、selenium原理和启动浏览器(Chromoption类)
  19. 超火的壁纸网站,强烈推荐收藏!
  20. java神奇蜘蛛侠攻略_神奇蜘蛛侠攻略带领新手快速入门

热门文章

  1. 反病毒工具-Wsyscheck,Xuetr,PowerTool
  2. JS实现统一社会信用代码的效验(组织机构代码效验)
  3. 区块链关键技术研究进展
  4. 《动手学深度学习》报错 解决方案RuntimeError: DataLoader worker (pid(s) ...) exited unexpectedly
  5. 不可不知!4种常见的黑客攻击手段
  6. 华硕天选 3 和 联想拯救者 Y9000P 2022 款 哪个好
  7. cox(Quaro)对设计的崭新定义,改变我的人生
  8. android闹钟小案例之知识点总结
  9. 分部积分法的快速运算 表格法
  10. 一文读懂Nabla算子