首页 > 其他分享 >learnopengl(7)变换

learnopengl(7)变换

时间:2023-08-16 19:13:23浏览次数:39  
标签:glm 缩放 变换 矩阵 uniform learnopengl trans 着色器

一、基础知识

主要是一些向量和矩阵的计算方式。大学本科期间的线性代数里面的内容。坦白来讲,当时学线性代数,虽然考了个还不错的分数,但是实际这些向量、矩阵后面的意义是什么并不知道。只学会了一些基础的计算方法。

 

二、实践

使用GLM库。

我们在上一节的基础上,先将每个轴都缩放到0.5倍,再沿z轴旋转90度。

    // 定义矩阵,先缩放后旋转,注意代码顺序。
    glm::mat4 trans(1.0f);
    trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f));
    trans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5));

我们是先缩放,后旋转,为什么代码顺序是先旋转后缩放呢?

假设我们要进行变换的矩阵是A,进行缩放操作的矩阵是B,进行旋转操作的矩阵式C,最后的结果是D。

正确的计算顺序是 D = CBA.

我们如何将该矩阵传递给着色器呢?

我们修改顶点着色器程序,接收一个mat4的uniform变量,然后再用该mat4的矩阵乘位置。

顶点着色器的程序为:

#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.0f);
    TexCoord = vec2(aTexCoord.x, 1.0 - aTexCoord.y);
}

我们把该uniform传递给着色器:

    unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
    glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));

我们首先查询uniform变量的地址,然后用有Matrix4fv后缀的glUniform函数把矩阵数据发送给着色器。

glUniformMatrix4fv第一个参数是uniform的位置值。第二个参数告诉OpenGL我们将要发送多少个矩阵,这里是1。第三个参数询问我们是否希望对我们的矩阵进行转置(Transpose),也就是说交换我们矩阵的行和列。OpenGL开发者通常使用一种内部矩阵布局,叫做列主序(Column-major Ordering)布局。GLM的默认布局就是列主序,所以并不需要转置矩阵,我们填GL_FALSE。最后一个参数是真正的矩阵数据,但是GLM并不是把它们的矩阵储存为OpenGL所希望接受的那种,因此我们要先用GLM的自带的函数value_ptr来变换这些数据。

最后的结果为:

标签:glm,缩放,变换,矩阵,uniform,learnopengl,trans,着色器
From: https://www.cnblogs.com/errorman/p/17635966.html

相关文章

  • LearnOpenGL(6) 纹理
    一、纹理是什么?我的第一反应是一张图片。在计算机图形学中,纹理被更多的认为是一块数据,它也不再局限于2D空间。具体请参考这篇文章:纹理那些事。 二、基础知识纹理坐标纹理坐标是纹理与图形的映射关系,图形中每个顶点都会关联一个纹理坐标,表示顶点需要从该位置读取纹理图像的......
  • 图像的2D几何变换
    基本概念齐次坐标使用N+1维坐标来表示N维坐标,例如在2D笛卡尔坐标系中加上额外变量w来形成2D齐次坐标系\((x,y)\Rightarrow(x,y,w)\)。这样做的好处是,在齐次坐标下,图像的几何变换可以利用矩阵的线性变换来表示。齐次坐标具有规模不变性,同一点可以被无数个齐次坐标......
  • VTK 实例44:二维图像快速傅里叶变换(频域处理)
    1#include"vtkAutoInit.h"2VTK_MODULE_INIT(vtkRenderingOpenGL2);3VTK_MODULE_INIT(vtkInteractionStyle);45#include<vtkSmartPointer.h>6#include<vtkImageData.h>7#include<vtkImageFFT.h>8#include<......
  • 时间序列去趋势化和傅里叶变换
    在计算傅里叶变换之前对信号去趋势是一种常见的做法,特别是在处理时间序列时。在这篇文章中,我将从数学和视觉上展示信号去趋势是如何影响傅里叶变换的。这篇文章的目的是让介绍理解什么是常数和线性去趋势,为什么我们使用它们,以及它们是如何影响信号的傅里叶变换的。傅里叶变换快......
  • 基于FFT傅里叶变换的64QAM基带信号频偏估计和补偿算法FPGA实现,包含testbench和matlab
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,并使用matlab2022a对结果进行星座图的显示:    将FPGA的频偏基带QPSK信号和频偏补偿后的QPSK基带信号使用matlab显示星座图,结果如下:   2.算法涉及理论知识概要        FFT傅里叶变换是一种高效的......
  • 封装一个useTable 内置分页 条件变换查询
    import{Table}from'antd';import{useImmer}from'common/hooks/useImmer';import{get}from'utils/request';importtype{ColumnsType,TablePaginationConfig}from'antd/es/table';import{useState}from......
  • 基于FFT傅里叶变换的16QAM基带信号频偏估计和补偿算法FPGA实现,包含testbench和matlab
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,并使用matlab2022a对结果进行星座图的显示:   将FPGA的频偏基带QPSK信号和频偏补偿后的QPSK基带信号使用matlab显示星座图,结果如下:   2.算法涉及理论知识概要       FFT傅里叶变换是一种高效的频谱分析......
  • 拉普拉斯变换的几何直观理解
    傅里叶变换具有非常广泛的应用,但是也有明显的缺点,就是对函数的要求太苛刻,主要便现在:要求函数在绝对可积,即满足,傅里叶变换存在.这个条件要求当,,事实上,很多函数都不满足这个条件,比如,正弦和余弦函数,单位阶跃函数等.要求函数必须在整个区间有定义,对于定义在区间的函数,比如以时间t为变......
  • 分布理论读书笔记三:Fourier变换
    5.\(\mathscr{S}\)上的傅里叶变换5.1.Schwartz函数空间\(\mathscr{S}(\mathbb{R}^n)\).定义1:设\(\varphi\inC^{\infty}(\mathbb{R}^n)\),如果对任意非负多重指标\(\alpha,p\)都有:\[\lim_{|x|\to\infty}|x^{\alpha}\partial^p\varphi|=0\qquad(eq1)\]在\(\mathbb{R}......
  • 《VTK图形图像开发进阶》第2章——坐标系统及空间变换
    2.1坐标系统计算机图形学里常用的坐标系统主要有4种,分别是Model坐标系统、World坐标系统、View坐标系统和Display坐标系统,此外还有两种表示坐标点的方式:以屏幕像素值为单位和归一化坐标值(各坐标轴取值范围为[-1,1])。它们之间的关系如下图。Model坐标系统:定义模型时所采用的......