OpenGL Six (Transformation)

首先。你得保证你的线性代数的功底是OK的。

然后,不管OK不OK,继续看吧。( /滑稽 )

GLM

  • 在OpenGL中没有自带的运算方式,所以我们要使用GLM这个库。
  • 使用方法:
    • 点击下载GLM9.8版本或者在visual studio的NuGet包管理工具中下载并安装9.8.5版本
    • 点击"Alt + Enter"键,在" C/C++ "列表中选择" 常规 ",点击附加包含目录,添加glm的目录即可
  • 引入
#include<glm/glm.hpp>
#include<glm/gtc/matrix_transform.hpp>
#include<glm/gtc/type_ptr.hpp>
/* 大多数功能都可以在这三个头文件中找到 */

一起来愉快的与线代玩耍

  • 首先做一个小小的操作:把一个向量(1,0,0)位移(1,1,0)个单位( 注意,我们把它定义为一个glm::vec4类型的值,齐次坐标定为1.0 )。

    glm::vec4(1.0f,0.0f,0.0f,1.0f);//使用GLM内建的向量类定义一个叫做vec的向量
    /* 下面就是矩阵初始化的一个例子 */
    glm::mat4 trans;//定义一个mate4类型的trans,默认就是一个4*4的矩阵
    trans = glm::translate(trans,glm::vec3(1.0f,1.0f,0.0f));//创建一个变换矩阵,把一个矩阵和一个单位向量传递给glm::translate
    vec = trans * vec;        //矩阵相乘
    cout<<vec.x<<vec.y<<vec.z<<endl;
  • 然后做一个大操作。把上次渲染出来的正方形逆时针旋转90度再缩放0.5倍。

    /* 创建变换矩阵 */
    glm::mat4 trans;
    /* GLM希望角度是弧度制的,所以使用glm::rotate将角度转化为弧度,下一个参数是绕着哪一个方向向量旋转 */
    trans = glm::rotate(trans,glm::radians(90.0f),glm::vec3(0.0,0.0,1.0));
    trans = glm::scale(trans,glm::vec3(0.5,0.5,0.5));
  • 下一个大问题如何把矩阵传递给着色器。GLSL里有一个mat4类型,所以我们可以修改顶点着色器让其接收一个mat4的uniform变量,然后再用矩阵uniform乘位置向量

    #version 330 core
    layout(location = 0) in vec3 aPos;
    layour(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);
    }
  • 然后把变换的矩阵传递给着色器

    unsigned int transformLoc = glGetUniformLocation(shader.ID,"transform");
    //查询uniform的位置
    glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));
    //把矩阵发送给着色器
    /*
    第一个参数是uniform的位置,第二个参数是矩阵的数量,第三个参数表名是否需要行列交换,第四个参数是真正的矩阵数据
    */

源码获取

main shader Triangle vertexShader fragmentShader

猜你喜欢

转载自www.cnblogs.com/LittleBanana/p/11894026.html
six
今日推荐