OpenGL的渲染流水线:
OpenGL的坐标系
在3D图形学里,OpenGL为右手坐标系(准确来说,OpenGL的世界空间和相机空间是右手坐标系)。随便提一下,D3D11为左手坐标系。
(1) 右手坐标系
(2) 左手坐标系
OpenGL的矩阵和向量结合方式
OpenGL的向量为列向量,矩阵和向量采用的方式为“矩阵X列向量”的方式,而D3D11为"行向量X矩阵"的方式。OpenGL的向量矩阵结合如下所示:
当多个矩阵乘以向量时,应该从右向左计算,比如存在三个矩阵:Proj,View,Model 向量:Pos
Proj*View*Model*Pos 代表 向量Pos先进行Model的变换,然后在进行View的变换,最后进行Proj的变换
OpenGL的各个空间的变换矩阵
世界变换矩阵
我一般称世界矩阵为SRT矩阵,SRT分别是"Scale","rotate","translate"三个单词的缩写,也就是世界矩阵由缩放矩阵,旋转矩阵,平移矩阵构成的
(1)缩放矩阵 (ScaleMatrix)
假设在X轴缩放Sx倍,在Y轴缩放Sy倍,在Z轴缩放Sz倍,缩放如下所示:
顶点乘以矩阵的公式如下:
(2)旋转矩阵
在说明旋转矩阵之前,我得说明一下,在右手坐标系如何判断哪个方向为顺时针方向旋转。
先来看下面的图,我们先用右手的拇指朝向Y的正方向,则四指所绕的方向也就是饶Y轴渲染的顺时针方向了,其它轴的顺时针方向同理也就是这样判断。
一,绕X轴顺时针旋转Θ度数
二,绕Y轴顺时针旋转Θ度数
三,绕Z轴顺时针旋转Θ度数
(3)移动矩阵(TranslateMatrix)
假设某个顶点在X轴方向移动dx个单位,Y轴移动dy个单位,在Z轴移动dz个单位
二,相机变换矩阵(ViewMatrix)
在此之前看看UVN相机模型,如图所示:
计算UVN向量的公式如下:
这里的“X”为叉乘的意思,并且一样可以通过右手规则(OpenGL世界空间为右手坐标系)得到叉乘向量的方向,也就是用右手从叉乘符号左边那个向量绕向叉乘符号右边的那个向量,拇指所指方向即为叉乘得到向量的方向。
相机矩阵如下所示:
具体推导见文章:推导相机变换矩阵,当然这篇博客对于OpenGL的相机矩阵计算是有些错误的。
三,透视投影矩阵(PerspectiveMatrix)
在推导透视投影矩阵前先看看视截体(Frustum)是怎么样的:
视截体在YZ平面的投影如下面图所示,
n为原点到近截面的距离,f为原点到远截面的距离,α为视截体在YZ平面投影的FOV视角,r为投影平面的宽高比,则透视投影矩阵为:
具体推导参见文章: