图形学入门:渲染管线总结

首先,什么是渲染管线?

渲染管线就是将3D空间中的事物转化为2D平面图(降维打击)。

计算机图形渲染管线分为三个大的阶段:
一、应用程序阶段
二、几何阶段
三、光栅化阶段

应用阶段(主要由CPU负责)

一、剔除
剔除总共分为四步:
1,距离剔除 (默认不开启,details->LOD)
当从近向远拉镜头的时候,会看到有物体突然消失的效果,UE4会自动进行一个检查,看一个物体是否超出了某个距离,如果超过了,那么就不渲染它。在下一帧中,就不会被渲染。它不仅适用于物体,还适用于粒子。
在这里插入图片描述

2,视锥体剔除(默认开启,并且无法被禁用)
摄像头有一个视角,超出视角的物体是看不见的,所以不会被渲染。
3,预计算可见性(默认不开启,world settings->Precomputed Visibility)
渲染前,会与计算哪些物体是被遮挡的,如果被遮挡了,就不渲染这个物体。
细节:可以打开可视化,这时候UE4会显示一个一个的单元格,每当摄像机走到单元格,就会向单元格询问,我能看到哪些?我不能看到哪些?能看到的,就会被渲染。
在这里插入图片描述

4,遮挡剔除
精确计算每一个物体的可见性,询问每一个模型的可见性。而巨大的物体通常是被一直渲染的。(可以通过freeze rendering)

以上四种剔除方式的消耗是递增的。
讨论:那既然3和4的损耗大,为什么不把小的模型合并成大的模型呢?因为这样就可以减少对象数量了。
这样的确可以减少模型数量,但是即使只能看到一个角,整个大的模型也都会被渲染,而大部分模型我们是看不到的。

二、Drawcall
传递各项参数给对应的函数接口,交由GPU处理。参数有:顶点坐标、法向量、纹理坐标、纹理。

几何阶段(主要由GPU负责)

几何阶段主要有两个任务:
一、变换三维顶点坐标
二、光照计算

三维顶点坐标变换流程图:
在这里插入图片描述
这个过程可以参考在真实世界中,是如何拍照的?
1,寻找拍摄对象(模型变换) 2,摆放相机(相机变换)
3,调节相机参数(投影变换) 4,拍照(视口变换)

模型变换(顶点着色器)
将本地坐标变换为世界坐标,比如想要将一个模型导入UE4,这个模型本身是有形状的,因此顶点会有一个相对位置,那么要将模型导入世界,它在世界中中就要有自己的坐标,这个过程就是模型变换。举例:P是本地坐标,用模型坐标乘以P,P`就是世界坐标
在这里插入图片描述

相机变换
要得到相机坐标下的位置,首先要把相机坐标系移动到世界坐标系中,即相机坐标系的逆变换。此时模型坐标系,在左侧叠加了一个相机坐标系的逆矩阵。
在这里插入图片描述
正交投影变换
将3D物体投影到2D平面,但是实际的操作,是将相机放到视锥体的中心。具体有三个操作步骤
1,位移矩阵(移动视锥体到相机坐标的中心) ->Mt
2,缩放矩阵(将边的大小缩放到-1与1之间) ->Ms
3,Z的方向要反向,Z本来默认指向屏幕外的反向,但这并不是相机拍摄的方向->M-z

最后正交投影矩阵->M-zMsMt
在这里插入图片描述
透视投影
1,投影
2,归一化
透视投影跟正交投影相对,透视投影依据近大远小原则。而最终显示的大小,与距离大小成负相关。
在这里插入图片描述
本可以通过上述式子最右边的4*4矩阵得到投射点的坐标,但是该矩阵是不可逆的(矩阵的不满秩),所以无法在实际中应用。实际中会有方案解决。
在这里插入图片描述
视口变换
将(-1,1)范围转换到屏幕坐标,深度值从(-1,1)转换到(0,1),缩放2倍
1,缩放
2,移动
合成到一起之后就变成了了下图的公式;(左侧移动,右侧缩放):
移动:(Xmin+Xmax)/2,(Ymax+Ymin)/2,1/2;
缩放:(Xmax-Xmin)/2,(Ymax-Ymin)/2,1/2;
在这里插入图片描述

光栅化阶段(GPU负责)

使用上个阶段传递的数据来产生屏幕上的像素,并渲染出最终的图像。
主要分为两个部分:
一、几何部分 :决定窗口坐标中哪些整形栅格区被基本图元占用
二、着色部分:分配一个颜色值和深度值到各个区域

几何部分
1,如何判断Viewport内任一像素P是否位于Triangle内部?
在这里插入图片描述

引入边函数EdgeFunction:
三个顶点V1(3,20)、V2(13,2)、V3(2725),任意一点P。
变函数EdgeFunction
Edge12(P)=(P.x-V1.x)*(V2.y-V1.y)-(P.y-V1.y)*(V2.x-V1.x)
Edge12(P)=-18*P.x-10*P.y+254
左侧像素Edge12(P)>0
右侧像素Edge12(P)<0

可以得到:三角形内的像素符号为负,三角形外的像素符号为正。这里贴一个三角形面积公式:
S=1/2|x1y2-x1y3+x2y3-x2y1+x3y1-x2y2|
其实是1/2(AB×AC);

2,如何遍历视口内的像素得到三角形内的像素:
视口逐级分Tile。先判断tile的四个顶点是否可见,如果不可见直接剔除:
如何部分可见或者全部可见,递归判断次级Tile是否可见
在这里插入图片描述

着色部分
判断出像素位于三角形内部后,下一步需要解决像素颜色的计算问题
此时已经确定了像素在Viewport里位置P(x,y)
如上面的公式所示,通常还需要计算出来像素对应的

–像素深度Depth
–纹理坐标UV
–法线Normal

Depth、UV和Normal是顶点属性,这个问题通常称为<顶点属性的插值问题>
//待完成;
https://zhuanlan.zhihu.com/p/31780748

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注