渲染流程概述
渲染流程包括 CPU应用程序端渲染逻辑 和 GPU渲染管线
一、CPU应用程序端渲染逻辑
- 剔除操作
- 对物体进行渲染排序
- 打包数据
- 调用Shader SetPassCall 和 Drawcall
1.剔除操作
- 视椎体剔除
(给物体一个包围盒,利用包围盒和摄像机的视椎体进行碰撞检测,在视椎体外的物体被剔除)
- 层级剔除
(给物体设置层级标识,利用层级剔除物体)
- 遮挡剔除
(被遮挡的物体将不会显示渲染在屏幕中)
2.排序操作
- 渲染队列 (先渲染不透明物体再渲染半透明物体)
- 不透明队列 (从前到后渲染)
- 半透明队列 (从后往前渲染)
3.打包视椎体内模型的数据
- 模型信息 (顶点坐标、法线、UV、顶点颜色、索引列表等)
- 变换矩阵
- 灯光、材质参数
比如一个正方体模型的信息:
4.提交数据到GPU端
- SetPass Call
(设置渲染状态,告诉GPU端需要使用哪一个Shader/Pass、混合模式以及背面剔除的设置)
- Draw Call
(CPU调用图像应用编程接口,来命令GPU进行渲染的操作)
引用自DrawCall、Batches、SetPassCalls的区别和联系_setpasscall draw call-CSDN博客
二、GPU渲染
1.顶点Shader阶段
-
将模型空间顶点转换到裁剪空间下
(顶点Shader并不会产生2D图像,仅使得场景中的3D图像产生变形的效果)
转换步骤:
2.图元装配以及光栅化阶段
-
裁剪操作(针对裁剪空间下内外模型的三角面而言,不会直接丢弃整个物体)
-
将裁剪空间下的模型的顶点坐标转换为标准化设备坐标 (-1,1)
-
模型的背面剔除
-
将标准化的设备坐标中的(x,y)转换为屏幕坐标(x,y)
(以上为对顶点的操作)
-
图元装配阶段(将各个顶点连接形成封闭的三角图元)
-
光栅化
3.片元Shader(上色)
(1)纹理技术
纹理采样
纹理过滤机制
Mipmap
纹理寻址模式
纹理压缩格式
纹理过滤机制:
为了解决小图像映射到大块区域所产生的失真的情况(如下图锯齿效果)
纹理过滤机制的原理:
根据周围四个纹素点进行插值计算(双线性插值),生成比较柔和的图像效果
Mipmap:(生成多级渐远贴图)
为了解决大图像映射到小块区域时引起图像失真的情况
(可以将高级别模糊的图像应用到远处或者小块的区域上)
(2)光照计算
光照组成
直接光照、间接光照
光照模型
基本的光照框架=直接光漫反射+直接光镜面反射+间接光漫反射+间接光镜面反射
4.输出合并阶段
- 通过片元Shader输出的数据(例如片元颜色、深度值等)
- 进行相关的测试(Alpha测试、模版测试、深度测试等)
最后总结: