OpenGL中的变换

1. 矩阵变换

在opengl中矩阵变换使用的为齐次坐标;使用齐次坐标有几点好处:它允许我们在3D向量上进行位移,同时也方便使用透视投影操作。本篇文章主要偏向于实现,不深究理论的知识。

1.1 缩放

为向量(x,y,z)定义一个缩放矩阵
在这里插入图片描述

1.2 平移

为向量(x,y,z)定义一个平移矩阵
在这里插入图片描述

1.3 旋转

旋转过程涉及到弧度与角度的转化

  • 弧度转角度:角度 = 弧度 * (180.0f / PI)
  • 角度转弧度:弧度 = 角度 * (PI / 180.0f)
    opengl中使用的是角度制

为向量(x,y,z)定义一个旋转矩阵
在这里插入图片描述

1.4 矩阵组合

假设我们有一个顶点(x, y, z),我们希望将其缩放2倍,然后位移(1, 2, 3)个单位。变换矩阵可以描述为:
在这里插入图片描述
注意:最右边的矩阵是第一个与向量相乘的,所以应该从右向左读这个乘法,即先缩放后平移。

2. 案例实现

在OpenGL中使用矩阵变化,首先需要包含矩阵库GLM

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

先测试下是否配置成功:

glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f);//坐标(1.0f, 0.0f, 0.0f)
// 下面是矩阵初始化的一个例子,如果使用的是0.9.9及以上版本
// 下面这行代码就需要改为:
// glm::mat4 trans = glm::mat4(1.0f)
glm::mat4 trans;//变换矩阵
trans = glm::translate(trans, glm::vec3(1.0f, 1.0f, 0.0f));//构建平移矩阵
vec = trans * vec;
std::cout << vec.x << vec.y << vec.z << std::endl;

若是输出结果为(2,1,0)说明配置成功

在做变换之前需要修改下顶点着色器,在着色器中添加与变换矩阵相关的内容

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;

out vec2 TexCoord;

uniform mat4 transform;//GLSL中的mat4类型

void main()
{
   
//修改顶点着色器让其接收一个mat4的uniform变量,然后再用矩阵uniform乘以位置向量
	gl_Position = transform * vec4(aPos, 1.0);
	TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}

其余的部分代码保持不变,仅需要修改渲染循环中的代码:

[transformLoc 矩阵一系列变换....]
unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));
  • 第一个参数你现在应该很熟悉了,它是uniform的位置值。
  • 第二个参数告诉OpenGL我们将要发送多少个矩阵,这里是1。
  • 第三个参数询问我们是否希望对我们的矩阵进行转置(Transpose),也就是说交换我们矩阵的行和列。OpenGL开发者通常使用一种内部矩阵布局,叫做列主序(Column-major Ordering)布局。GLM的默认布局就是列主序,所以并不需要转置矩阵,我们填GL_FALSE。
  • 最后一个参数是真正的矩阵数据,但是GLM并不是把它们的矩阵储存为OpenGL所希望接受的那种,因此我们要先用GLM的自带的函数value_ptr来变换这些数据
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenGL 是一种用于图形渲染和输出的专业级计算机图形接口标准,主要用于游戏开发、科学可视化等领域。而小波变换是一种数学工具,它将信号分解为不同尺度和频率的信息,常用于图像处理和数据分析。 在 OpenGL 直接应用小波变换并不是标准功能,因为 OpenGL 主要是用来绘制几何形状和纹理,并不是数据分析或高级数学运算平台。然而,在实际的应用,特别是在 GPU 加速计算兴起后,开发者可能会利用 OpenGL 或其相关库(如 CUDA)结合外部的小波变换库(比如 Daubechies 小波或 Coiflet 小波等),在图形硬件上对图像数据进行实时的小波变换,提升处理速度。 这种做法的优势在于利用了 GPU 并行计算的能力,可以在渲染图形的同时进行一些算数密集型的数学操作,例如离散小波变换(DWT)。不过,具体实现会涉及到编写额外的 OpenGL 库扩展或自定义着色器代码。 如果你对如何在 OpenGL 结合小波变换感兴趣,可能会涉及以下几个步骤: 1. **选择合适的小波库**:找到适合 GPU 的小波库,如 OpenCL 或 CUDA 实现的。 2. **编写着色器代码**:用 GLSL(OpenGL Shading Language)编写程序,实现小波变换算法的并行化版本。 3. **数据传输**:将图像数据从 CPU 传送到 GPU,进行处理后再返回到 CPU。 4. **集成测试**:确保在图形上下文运行正确并能够实时处理数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LV小猪精

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

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

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

打赏作者

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

抵扣说明:

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

余额充值