当前位置: 首页 > article >正文

OpenGL 入门 6:GLM

GLM是OpenGL Mathematics的缩写,它是一个只有头文件的库,也就是说我们只需包含对应的头文件就行了,不用链接和编译。GLM可以在它们的网站上下载。把头文件的根目录复制到你的includes文件夹,然后你就可以使用这个库了。

头文件

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

GLM的大多数功能都可以从下面这3个头文件中找到

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::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)

参考链接

【1】https://blog.csdn.net/qq_42537915/article/details/104146135?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

【2】https://blog.csdn.net/Wonz5130/article/details/83116009?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.channel_param

http://www.lryc.cn/news/2415113.html

相关文章:

  • 详细解释sprintf 函数(转)
  • 网络性能测试工具-Iperf
  • [前后端]JSP入门
  • 元素定位之XPath定位-学习
  • 【Nessus安装、使用】
  • Linux命令 | 常用命令之 find
  • 字符串函数---strstr()、memchr()、strchr()详解及实现
  • 【数据结构】树(一)—— 树的基础知识(C语言版)
  • CDSN文章转载方法
  • Git从入门到熟练第十讲 cloning
  • Mac安装brew,支持m芯片,5分钟安装成功亲测有效
  • 浅谈网络共享之samba服务
  • CSS预处理语言~~Less安装与使用
  • Java的byte类型详解
  • ICMP协议与ARP协议
  • unity基础(2)——3D对象基础概念与简单操作
  • 发现数学之美--微积分的起源和用途(一文搞懂微积分)
  • QEMU简介
  • 基于微信PC端小程序抓包方法
  • Hex文件解析
  • 超详细一文到底!软件测试基本流程
  • 富文本编辑器汇总
  • 一篇了解使用springSecurity
  • jar包的概念及作用(二)运行jar包、查看jar包内容
  • 推荐开源项目:NSFW Filter — 图片安全性智能检测库
  • 【机器学习】SGD,SGDM,NAG,Adagard,AdaDelta,RMSpro,Adam原理
  • 【Python/绘图】python绘图
  • [计算机效率] 文件搜索工具:Listary(附详细使用教程)
  • IO的详细介绍
  • CPP/C++学习笔记01