OpenGL 相机 LookAt 矩阵计算

原理: 相机的运动实际上是对世界坐标系中的物体进行反向运动变换 相机的运动矩阵与其他物体的变换矩阵类似 先缩放变换,再进行旋转,最后进行平移 所以 glm::lookAt 函数返回的是相机变换矩阵的逆矩阵 先对相机的平移矩阵求逆,然后乘以旋转矩阵的逆矩阵(参考计算矩阵乘积的逆矩阵公式) 注意事项: 相机矩阵的 Z轴 与相机的照射方向相反 glm 中的矩阵是列向量优先 正交矩阵的逆矩阵等于它的转置 刚体运动中变换矩阵的逆矩阵求解: 刚体运动变换矩阵: $$\begin{equation} T = \begin{bmatrix*}[c] R & t \newline 0^T & 1 \end{bmatrix*} \end{equation}$$ 分块矩阵求逆公式 $$\begin{equation} M = \begin{bmatrix*}[c] A & B \newline 0 & D \end{bmatrix*} \space\space\space\space M^{-1} = \begin{bmatrix*}[c] A^{-1} & -A^{-1}BD^{-1} \newline 0 & D^{-1} \end{bmatrix*} \end{equation}$$ 刚体运动变换矩阵的逆矩阵: $$\begin{equation} T^{-1} = \begin{bmatrix*}[c] R^{-1} & -R^{-1}t \newline 0^T & 1 \end{bmatrix*} = \begin{bmatrix*}[c] R^T & -R^Tt \newline 0^T & 1 \end{bmatrix*} \end{equation}$$ 方法一: glm::mat4 Camera::calculateLookAtMatrix() { // 1....

June 28, 2022 · 2 min · Rick Cui

OpenGL 渲染管线

红宝书第九版,OpenGL Version 4.5 Games101 闫令琪 顶点数据->顶点着色器(MVP 矩阵变换,NDC 标准化设备坐标)->细分控制着色器->细分计算着色器->几何着色器->图元装配->裁剪和剔除->光栅化->片元着色器 片元着色器后,可能还有混色、测试等流程,最后将渲染结果输入到 Frame Buffer 中 顶点着色器: 将传入的顶点坐标进行 MVP 矩阵变换,经过顶点着色器,它们就该是标准化设备坐标。 细分着色: 细分着色包括细分控制着色器和细分计算着色器,细分控制着色器和细分计算着色器是相互依存的,要么都不要,要么都要。细分着色的作用就是通过面片(patch)来描述一个物体的形状。顶点着色器只能处理每个顶点关联的数据,而细分着色能通过面片的形式分割更多的数据点(比如曲面细分) 细分控制着色器:细分控制着色器的一个常见应用就是将输入面片顶点(控制点)传递给细分计算着色器和通过设置细分层次因素,告诉 OpenGL 怎么生成顶点,每个顶点的标注化二维坐标(细分坐标)以二维向量(也就是说只有其 x 和 y 分量是有效的)的方式保存在变量 gl_TessCorrd 内,该变量会被传递到细分计算着色器中(注:gl_TessCorrd 保存的是一个线段的因子,如一个线段的 0.5 横坐标处,那么 gl_TessCorrd.x=0.5); 细分计算着色器:细分控制着色器完成后,细分计算着色器就通过控制点和细分坐标生成一系列顶点坐标,输出跟顶点着色器是一样的。 更多细节:可以看文章OpenGL 图元处理 几何着色器: 几何着色器提供了一种更加灵活的图元生成方法,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。原理上来说,几何着色器通过一些手段也可以完成细分着色器的任务,但是为什么需要细分着色器呢?这是因为在某些图元生成上,细分着色器可以更加精确或者方便,比如生成三角形网格顶点,更多介绍参见几何着色器。可以看到,顶点着色器,细分着色器和几何着色器本质上都是对顶点进行处理。 图元装配: 前面的着色阶段都对顶点进行操作,关于这些顶点如何被组织成几何图元的信息并传到到 OpenGL 的下个阶段。图元组装阶段将顶点组织成它们相关的几何图形,为裁剪和光栅化做准备。 裁剪和剔除: 偶尔,顶点会在视口之外(窗口的区域),并对与顶点相关的图元进行修改,使其像素都不在视口之外。这个操作被称为裁剪,并由 OpenGL 自动处理。 光栅化: 经过以上步骤,基本上一个图形就形成了,但是这个图形的坐标还是在自己的坐标系中,光栅化就是将图形的坐标转化为屏幕像素坐标,最终将图元的数学描述转化为用于显示在屏幕上的片段,然后通过帧缓存就可以在电脑上看到一个个美丽的图形。 片元着色器: 片元着色器是opengl渲染的最后一个流程,它的主要作用就是赋予我们图形最终的颜色,纹理渲染也在这个阶段 参考: 顶点着色器到片元着色器的过程,varying变量 opengl基本流程 OpenGL学习脚印: 投影矩阵和视口变换矩阵(math-projection and viewport matrix) OpenGL入门(五)– OpenGL渲染流程图解析 Opengl复习笔记(一)——顶点着色器、片段着色器(内含代码) GPU是如何工作的?Shader图形编程入门 GAMES101-现代计算机图形学入门-闫令琪 20分钟让你了解OpenGL——OpenGL全流程详细解读 OpenGL学习:Per-fragment operation(1)-模板测试(stencil test)

June 17, 2022 · 1 min · Rick Cui