渲染是指以软件由模型生成图像的过程
渲染管线(广义)分为CPU应用程序端渲染逻辑和GPU渲染管线(通常我们说的渲染管线)
摄像机根据FOV(Field of View 视场角) 和远近裁面形成一个锥台,让模型和这个锥台进行碰撞检测,如果没有碰撞说明不在视野内,直接剔除,不需要渲染。
Tips 1: 有的模型表面的网格非常复杂(比如球体)
简化处理:生成一个AABB包围盒与锥台进行碰撞检测
Render Queue 的数值越小,表示物体越先被渲染
如果Render Queue相等,会分成两个渲染队列,不透明渲染队列和透明渲染队列
按摄像机距离从前到后排序
Tips 1: Why?
这其实是一种优化,离得近的如果覆盖了遮挡了距离远的,那后者就可以不用渲染了
按摄像机距离从后向前排序
Tips 1: Why?
这是为了保证渲染结果的正确性
包含大量数据和参数
收到指令SetPassCall、DrawCall 和 CPU 传送的打包数据
顶点Shader:将模型空间顶点转换成裁剪空间,然后又硬件来将这些顶点映射到屏幕上(3D变2D)
拍照过程:放置物体 -> 摆好相机 -> 摁下快门
通过矩阵完成以下空间变化
① 模型空间 -> 世界空间
② 世界空间 -> 相机空间
③ 相机空间 -> 裁剪空间
图元装配:将点连接起来
光栅化:在图元内部插入片元(类似还没有显示的像素)
光栅化之后3D彻底变成2D
具体操作
① 裁剪操作
对裁剪空间进行裁剪。与视锥体相交的部分会被裁剪不渲染部分并生成新的三角面,完全在外面的就直接裁剪掉
② 透视除法
将裁剪后的物体坐标缩放到标准化设备坐标(NDC)
③ 背面剔除
根据索引列表来判断是否为背面。
④ 视口转换
将标准化设备坐标转化为屏幕坐标(只转化x,y坐标)
⑤ 图元装配
前面的所有操作都是顶点操作,图元装配环节将点进行连线
⑥ 光栅化
生成在图形内部生成片元
z坐标值会通过插值储存为片元的深度值等各种数据来帮我们处理前后遮挡关系等
插值:我们知道两边界点的值,算出中间的值
每一个片元都会调用自己的片元Shader进行计算
片元Shader:对片元进行着色 ------ 光照着色,纹理着色
纹理图像:一个二维数组,利用文素地址储存一组颜色值
处理遮挡关系和颜色混合等等,并完成输出
流程:
① Alpha测试
检测片元的Alpha值,如果太小就可以直接丢弃
② 模板测试
③ 深度测试
检测片元的深度值:深度越小越应该渲染(小于深度缓冲区深度值才能写入,写入后更新深度缓冲区的深度值)
④ 混合
可以柔和地将片元都输出到像素点,进行混合
Tips 1: Shader是什么?
Shader是运行在GPU上的一段可编程的程序
一个完整的Shader由顶点Shader和片元Shader组合而成
帧缓冲区相当于是临时的画布,当全部渲染完毕时,帧缓冲区的内容可以显示到屏幕中
缓冲区分为颜色缓冲区、深度缓冲区和模板缓冲区
显示到屏幕前,CPU可以拿到帧缓冲区的内容,进行二次修改(调色、Bloom等)然后再传送给GPU渲染管线,最终才显示在屏幕上
每个相机会跑完整的渲染流程
相机通过Depth决定渲染顺序,后渲染的可以通过Clear Flags确定是否清除前一个相机的渲染。
参考资料:视频教程