渲染管线理解1

文章目录

  • 模型变换
  • 相机变换
  • 光照
  • 投影变换
    • 视锥

渲染管线整个流程如下:
渲染管线理解1_第1张图片
首先是顶点输入,通过模型变换,相机变换和投影变换变换到一个标准坐标系中ndc( x ∈ [ − 1 , 1 ] x\in[-1,1] x[1,1], y ∈ [ − 1 , 1 ] y\in[-1,1] y[1,1], z ∈ [ − 1 , 1 ] z\in[-1,1] z[1,1](或者[0,1])),但是光有顶点数据是不够的,需要把它组装成点或者线或者三角形片元。然后把数据从ndc坐标转换到屏幕坐标形成片元,最后插值属性(比如颜色,深度值等)。

模型变换

模型变换有最基本平移旋转和尺度变换,推倒下次写
(x,y,z)表示当前坐标,(x’,y’,z’)表示转换后的坐标,其次坐标公式表示如下:

  1. 平移变换
    [ x ′ y ′ z ′ 1 ] = [ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] [ x y z 1 ] \begin{bmatrix} x'\\ y'\\ z'\\ 1 \end{bmatrix}= \begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0& 1 \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} xyz1=100001000010txtytz1xyz1
  2. 旋转变换
  • x轴旋转
    [ x ′ y ′ z ′ 1 ] = [ 1 0 0 0 0 cos ⁡ θ x − sin ⁡ θ x 0 0 sin ⁡ θ x cos ⁡ θ x 0 0 0 0 1 ] [ x y z 1 ] \begin{bmatrix} x'\\ y'\\ z'\\ 1 \end{bmatrix}= \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos \theta_x & -\sin \theta_x & 0\\ 0 & \sin \theta_x & \cos \theta_x & 0 \\ 0 & 0 & 0& 1 \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} xyz1=10000cosθxsinθx00sinθxcosθx00001xyz1
  • y轴旋转
    [ x ′ y ′ z ′ 1 ] = [ cos ⁡ θ y 0 sin ⁡ θ y 0 0 1 0 0 − sin ⁡ θ y 0 cos ⁡ θ y 0 0 0 0 1 ] [ x y z 1 ] \begin{bmatrix} x'\\ y'\\ z'\\ 1 \end{bmatrix}= \begin{bmatrix} \cos \theta_y & 0 & \sin \theta_y & 0 \\ 0 & 1 & 0 & 0\\ -\sin \theta_y & 0 & \cos \theta_y & 0 \\ 0 & 0 & 0& 1 \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} xyz1=cosθy0sinθy00100sinθy0cosθy00001xyz1
  • z轴旋转
    [ x ′ y ′ z ′ 1 ] = [ cos ⁡ θ z − sin ⁡ θ z 0 0 sin ⁡ θ z cos ⁡ θ z 0 0 0 0 1 0 0 0 0 1 ] [ x y z 1 ] \begin{bmatrix} x'\\ y'\\ z'\\ 1 \end{bmatrix}= \begin{bmatrix} \cos \theta_z & -\sin \theta_z & 0 & 0 \\ \sin \theta_z & \cos \theta_z & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0& 1 \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} xyz1=cosθzsinθz00sinθzcosθz0000100001xyz1

相机变换

假设右手坐标系,与opengl一致看向-z轴,如下
渲染管线理解1_第2张图片
相对于世界的相机观察如下:
渲染管线理解1_第3张图片
相机y轴代表view up向量,相机x轴代表view side向量,-z轴代表了朝向,可以代表物体和相机的距离。
计算相机矩阵有二种方法:

  1. 相机相对原点的位置E,相机的朝向 v d i r v_{dir} vdir v u p v_{up} vup,都是单位化过, v s i d e = v d i r × v u p v_{side}=v_{dir}\times v_{up} vside=vdir×vup,如果不知道 v u p v_up vup,通常程序会设置一个垂直向上的方向 v w o r l d _ u p v_{world\_up} vworld_up,比如(0,1,0)。
    渲染管线理解1_第4张图片
    根据施密特正交:
    渲染管线理解1_第5张图片
    计算
    v u p = v w o r l d _ u p − ( v w o r l d _ u p ⋅ v d i r ) v d i r \mathbf v_{up}=\mathbf v_{world\_up}-(\mathbf v_{world\_up}\cdot \mathbf v_{dir})\mathbf v_{dir} vup=vworld_up(vworld_upvdir)vdir
    注意当 v w o r l d _ u p \mathbf v_{world\_up} vworld_up v d i r \mathbf v_{dir} vdir方向一致的时候 ( v w o r l d _ u p ⋅ v d i r ) v d i r = 1 ⋅ v d i r (\mathbf v_{world\_up}·\mathbf v_{dir})\mathbf v_{dir}=1·\mathbf v_{dir} (vworld_upvdir)vdir=1vdir得到KaTeX parse error: Expected 'EOF', got '\ ' at position 24: …v_{up}=\mathbf0\̲ ̲\mathbf v_{worl… v d i r v_{dir} vdir方向相反也是得到 0 \mathbf 0 0
    如果采用这种方法要避免world_up与观察方向一致。
    解决方法是出现这种情况是指定任意的一个向量,比如 i , j \mathbf i,\mathbf j i,j
  2. 知道E和三个旋转值roll,pitch ,yaw,可以直接得到相机矩阵
    把世界坐标转换到相机坐标: M w o r l d → v i e w \mathbf M_{world\to view} Mworldview
    通常我们直接求解从世界坐标系转换到相机坐标系的矩阵比较困难,但是找到一个从相机坐标系到世界坐标系的转换矩阵比较 M v i e w → w o r l d \mathbf M_{view\to world} Mviewworld
    即得到这个矩阵后,对它求逆(invert())即可。
    渲染管线理解1_第6张图片
    假设一开始世界坐标(黑色基)与相机坐标系(红色基)重合,相机相对世界坐标先旋转后平移到图3,把小人转换到相机坐标系,先进行一个逆平移,再进行一个逆旋转即可得到,
    即相机到世界的变换通过一个旋转和一个平移的仿射变换
    记原点到相机位置的向量记为 v p o s \mathbf v_{pos} vpos
    假设旋转的三个列向量量为 u , v , w \mathbf{u,v,w} u,v,w
    M v i e w → w o r l d = T R = [ i , j , k , v p o s ] [ u , v , w , 1 ] M v i e w → w o r l d = M v i e w → w o r l d − 1 = ( [ E v p o s 0 T 1 ] [ R 0 0 T 1 ] ) − 1 = [ R − 1 − ( R − 1 v p o s ) 0 T 1 ] = [ R T − ( R T v p o s ) 0 T 1 ] \mathbf M_{view\to world}=\mathbf {TR}= [\mathbf{i,j,k,}\mathbf v_{pos}][\mathbf{u,v,w,1}]\\ \mathbf M_{view\to world}=\mathbf M_{view\to world}^{-1}= \left( \begin{bmatrix} \mathbf E & \mathbf v_{pos}\\ \mathbf 0^T & 1 \end{bmatrix} \begin{bmatrix} \mathbf R & \mathbf 0\\ \mathbf 0^T && 1 \end{bmatrix} \right)^{-1}= \begin{bmatrix} \mathbf R^{-1} & -(\mathbf R^{-1}\mathbf v_{pos})\\ \mathbf 0^T & 1 \end{bmatrix}= \begin{bmatrix} \mathbf R^{T} & -(\mathbf R^{T}\mathbf v_{pos})\\ \mathbf 0^T & 1 \end{bmatrix} Mviewworld=TR=[i,j,k,vpos][u,v,w,1]Mviewworld=Mviewworld1=([E0Tvpos1][R0T01])1=[R10T(R1vpos)1]=[RT0T(RTvpos)1]
    通常R为正交矩阵即 R − 1 = R T \mathbf R^{-1} = \mathbf R^{T} R1=RT

光照

下次写

投影变换

投影定义
用一个线性变换把n空间的点变换到m空间(m 透视投影
渲染管线理解1_第7张图片
透视投影并不是真正的投影,3D到2D的转化是非线性的,平行直线不再平行

视锥

通常视锥把空间限制在一个6面的突面体,在这个体内的物体会被渲染或者一个截断无限金字塔。

你可能感兴趣的:(渲染管线)