OpenGL学习笔记(四)

OpenGL初级篇(四)

齐次坐标

目前把三维顶点视为三元组(x, y, z)。现在引入一个新的分量w,得到向量(x, y, z, w)。
使用齐次坐标有几点好处:可以使用线性变换来实现模型的位移,而且可以使用w值创建3D视觉效果。
在这里插入图片描述

复合变换

TransformedVector = TranslationMatrix * RotationMatrix * ScaleMatrix * OriginalVector;

注意,矩阵乘法不遵守交换律。当矩阵相乘时,在最右边的矩阵是第一个与向量相乘的,所以应该从右向左读这个乘法。在组合矩阵时,一般先进行缩放操作,然后是旋转,最后才是位移,否则它们会互相影响。

变换-OpenGL实现

OpenGL量身定做的数学库,那就是GLM。GLM是OpenGL Mathematics的缩写,它是一个只有头文件的库,也就是说只需包含对应的头文件即可,不用链接和编译。

  1. 初始化单位矩阵,接着设置变换矩阵为在每个轴都缩放到0.5倍,接着沿z轴旋转90度,最后位移(0.4, 0.4, 0)个单位。完成设置后得到所需的变换矩阵。
    在这里插入图片描述
    注意:实际的变换顺序与阅读顺序相反:尽管在代码中先位移再旋转最后缩放,实际的顺序却仍然是缩放,然后旋转再是位移的。
  2. 修改顶点着色器
    在变换之前,我们需要修改顶点着色器,让其接收一个 mat4 的 uniform 变量,然后在用矩阵 uniform 乘以位置向量:
    在这里插入图片描述
  3. 把变换矩阵传递给着色器
    首先用 glGetUniformLocation()查询了 uniform 变量地址。
    然后用 glUniformMatrix4fv()把矩阵数据发送给着色器。
    在这里插入图片描述
    4 把变换矩阵传递给着色器
    glUniformMatrix4fv()
    第一个参数是 uniform 的位置值;
    第二个参数告诉OpenGL发送的矩阵个数,这里是1;
    第三个参数确定是否进行矩阵置换(交换行和列)。GLM中不需要,所以设置为 GL_FALSE;
    第四个参数是矩阵数据,但GLM并不是把矩阵存储为OpenGL接受的格式,因此这里用 glm::value_ptr 函数变换数据。
    在这里插入图片描述

最终效果

在这里插入图片描述

纹理图像随时间旋转
把旋转函数的第二个参数改成了 glfwGetTime(),因此纹理图像旋转的弧度是随着运行时间的增加而不断增加的。
glm::translate()是位移函数,将纹理图像位移了(0.5, -0.5, 0.0) 个单位,则位移到了屏幕右下角
最后把变换矩阵传递给着色器
在这里插入图片描述

最终效果

请添加图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42050609/article/details/125134708