【我的OpenGL学习进阶之旅】OpenGL ES开发如何引入GLM(OpenGL Mathematics)库?以及#include< >和#include“ ”的区别

在这里插入图片描述

一、GLM库介绍

1.1 github官网介绍

在这里插入图片描述

1.2 glm库相关介绍

  1. OpenGL Mathematics (GLM)是一个基于OpenGL着色语言(GLSL)规范的面向图形软件的头文件c++数学库。

  2. GLM提供了与GLSL相同的命名约定和功能设计和实现的类和函数,因此任何了解GLSL的人都可以在c++中使用GLM

  3. 这个项目并不局限于GLSL特性。一个基于GLSL扩展约定的扩展系统,提供了扩展功能:矩阵转换、四元数、数据打包、随机数、噪声等。

  4. 这个库可以很好地与OpenGL一起工作,但它也确保了与其他第三方库和SDK的互操作性。对于软件渲染(光线追踪/光栅化)、图像处理、物理模拟和任何需要简单和方便的数学库的开发环境来说,它都是一个很好的候选者。

  5. GLM是用c++ 98编写的,但是在编译器支持的情况下可以利用c++ 11。它是一个平台无关的库,不依赖于任何平台,它官方支持以下编译器:

    • GCC 4.7 and higher
    • Intel C++ Compose XE 2013 and higher
    • Clang 3.4 and higher
    • Apple Clang 6.0 and higher
    • Visual C++ 2013 and higher
    • CUDA 9.0 and higher (experimental)
    • SYCL (experimental: only ComputeCpp implementation has been tested).
    • Any C++11 compiler

关于GLM的更多信息,请查看手册和API参考文档。源代码和文档在Happy Bunny许可证(修改MIT)或MIT许可证下授权。

1.3 glm库的示例代码

下面是一个glm库的使用示例代码。

#include <glm/vec3.hpp> // glm::vec3
#include <glm/vec4.hpp> // glm::vec4
#include <glm/mat4x4.hpp> // glm::mat4
#include <glm/ext/matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale
#include <glm/ext/matrix_clip_space.hpp> // glm::perspective
#include <glm/ext/scalar_constants.hpp> // glm::pi

glm::mat4 camera(float Translate, glm::vec2 const& Rotate)
{
	glm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, 4.0f / 3.0f, 0.1f, 100.f);
	glm::mat4 View = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Translate));
	View = glm::rotate(View, Rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f));
	View = glm::rotate(View, Rotate.x, glm::vec3(0.0f, 1.0f, 0.0f));
	glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f));
	return Projection * View * Model;
}

二、引入glm库

GLMOpenGL Mathematics的缩写,它是一个只有头文件的库,也就是说我们只需包含对应的头文件就行了,不用链接和编译。

2.1 下载glm库

我直接把项目以zip形式下载下来了
在这里插入图片描述

当然,可以到https://github.com/g-truc/glm/releases/tag/0.9.9.8下载release版本的

比如:GLM 0.9.9.8版本下载地址为:

2.2 解压下载的压缩包

解压完成,如下所示:
在这里插入图片描述

2.3 将glm-master\glm中的内容拷贝到app\src\main\cpp\include

在这里插入图片描述
glm-master\glm 目录的内容如下:
在这里插入图片描述
现在我们将glm-master\glm 目录的内容全部复制到Android Studio的项目中的app\src\main\cpp\include目录下,如下所示:
在这里插入图片描述
在这里插入图片描述

2.4 配置 app/src/main/cpp/CMakeLists.txt 文件

在这里插入图片描述
要添加的代码如下:

#设置包含的目录
include_directories(
       include
       
       ...  其他之前设置过的目录
 }

在这里插入图片描述

为啥要设置这个目录呢? 主要是为了方便我们后面引入glm库的头文件,这里介绍一下#include< >#include“ ”的区别

2.5 #include< >#include“ ”的区别

2.5.1 引用的头文件不同

  • #include< >引用的是编译器的类库路径里面的头文件。
  • #include“ ”引用的是你程序目录的相对路径中的头文件。

2.5.2 用法不同

  • #include< >用来包含标准头文件(例如stdio.h或stdlib.h).
  • #include“ ”用来包含非标准头文件。

2.5.3 调用文件的顺序不同

  • #include< >编译程序会先到标准函数库中调用文件。
  • #include“ ”编译程序会先从当前目录中调用文件。

2.5.4 预处理程序的指示不同

  • #include< >指示预处理程序到预定义的缺省路径下寻找文件。
  • #include“ ”指示预处理程序先到当前目录下寻找文件,再到预定义的缺省路径下寻找文件。

2.5.5 引入glm库的操作

因为我们上一步设置了include_directories,所以可以使用#include< >的方式来引用头文件,而不必使用#include“ ”的方式来引用头文件。

比如,我们可以这样写

#include <glm/gtc/matrix_transform.hpp>

在这里插入图片描述
没必要写下面这种方式,节省了写路径的时间

#include "../../include/glm/gtc/matrix_transform.hpp"

两种方式都是一样的,引入的头文件都是相同的路径,如下所示:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.6 使用glm库

2.6.1 引入glm库的相关头文件

比如, 想引入 glm/gtc/matrix_transform.hpp> 头文件,则添加如下代码

#include <glm/gtc/matrix_transform.hpp>

在这里插入图片描述

2.6.2 使用glm库

  • 定义变量

比如我们定义了下面两个变量:

    glm::mat4 m_MVPMatrix;
    glm::mat4 m_ModelMatrix;

在这里插入图片描述

  • 函数参数
    函数参数里也可以使用glm库定义的类型,如下:
    static void UpdateMatrix(glm::mat4 &mvpMatrix, glm::mat4 &modelMatrix, int angleXRotate, int angleYRotate, float scale, glm::vec3 transVec3, float ratio);

在这里插入图片描述

  • 实现函数
    如下,就使用了glm库做了一个matrix的相关操作
void
StencilTestingSample::UpdateMatrix(glm::mat4 &mvpMatrix, glm::mat4 &modelMatrix, int angleXRotate,
                                   int angleYRotate, float scale, glm::vec3 transVec3,
                                   float ratio) {
    LOGD("StencilTestingSample::UpdateMatrix angleX = %d, angleY = %d, ratio = %f", angleXRotate,
         angleYRotate, ratio)
    angleXRotate = angleXRotate % 360;
    angleYRotate = angleYRotate % 360;

    //转化为弧度角
    auto radiansX = static_cast<float>(MATH_PI / 180.0f * angleXRotate);
    auto radiansY = static_cast<float>(MATH_PI / 180.0f * angleYRotate);


    // Projection matrix
    //glm::mat4 Projection = glm::ortho(-ratio, ratio, -1.0f, 1.0f, 0.0f, 100.0f);
    //glm::mat4 Projection = glm::frustum(-ratio, ratio, -1.0f, 1.0f, 4.0f, 100.0f);
    glm::mat4 Projection = glm::perspective(45.0f, ratio, 0.1f, 100.f);

    // View matrix
    glm::mat4 View = glm::lookAt(
            glm::vec3(0, 0, 3), // Camera is at (0,0,1), in World Space
            glm::vec3(0, 0, 0), // and looks at the origin
            glm::vec3(0, 1, 0)  // Head is up (set to 0,-1,0 to look upside-down)
    );

    // Model matrix
    glm::mat4 Model = glm::mat4(1.0f);
    Model = glm::scale(Model, glm::vec3(scale, scale, scale));
    Model = glm::rotate(Model, radiansX, glm::vec3(1.0f, 0.0f, 0.0f));
    Model = glm::rotate(Model, radiansY, glm::vec3(0.0f, 1.0f, 0.0f));
    Model = glm::translate(Model, transVec3);

    modelMatrix = Model;

    mvpMatrix = Projection * View * Model;
}

在这里插入图片描述
这样我们就完成了Android引入glm库开发OpenGL ES的功能。

具体可以查看如下实例:

  • GitHub:https://github.com/ouyangpeng/OpenGLESDemo.git
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字节卷动

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值