渲染管线
概念
Unity的渲染管线是在图形学渲染管线的基础上,加上了高度可配置可扩展的框架,允许开发者自定义渲染流程。
渲染管线(渲染流水线)概述:将数据分阶段的变为屏幕图像的过程。
数据指的是模型、光源和摄像机等内容的顶点、纹理、光照等数据。
阶段:应用阶段—>几何阶段—>光栅化阶段
CPU和GPU
- CPU:中央处理器,负责逻辑处理。
- GPU:图形处理器,搭载在显卡上,负责渲染逻辑处理。
图元
在渲染管线中,图元是几何数据的基本单元,是构成几何体的最小可绘制单元。
图元可以是点、线、三角形,在几何阶段,顶点数据会被组合成图元。
这些图元将在光栅化阶段转换为像素,最终呈现在屏幕上。
像素
像素组成图像的最小可控单位。
具有位置和属性,用于表示颜色和其他信息。
二维图像中的一个点,每个像素都占据屏幕的固定位置。
片元
片元是光栅化阶段生成的像素或像素片段。
片元是渲染管线中进行像素级别操作和计算的基本单位。
其实片元就是像素加上了一些其他信息,如颜色、深度值、法线等。
应用阶段
概述:CPU将渲染数据传递给GPU,用于后两个阶段的处理。
应用阶段CPU为渲染准备了什么?
- 剔除不可见(相机外)的物体数据。
- 准备好模型相关的数据,如顶点、法线、切线、贴图、着色器等。
- 把数据加载到显存中。显存就是显卡的专用内存,用来存储显卡芯片处理过或者即将提取的渲染数据。
- 设置渲染状态,如网格需要使用哪个着色器、材质、光源属性等。
- 调用DrawCall,DrawCall就是CPU通知GPU用上面准备的数据和渲染状态进行渲染的命令。
应该尽可能避免多的DrawCall
因为它会影响性能。每次调用DrawCall,CPU就会给GPU发送大量的内容,效率就慢了,可能会造成卡顿。
怎么减少呢?批处理技术
- 将多个静态物体的网格合并为一个网格,变为一次DrawCall。
- 使不同网格使用同一种材质。
- 合并图集:将多张图片合并成一张大图。(2D游戏和UI中常用)
几何阶段
几何阶段是GPU主导的阶段,它的主要工作为:顶点处理、坐标转换、裁剪画面外图元。
概述:在几何阶段,我们主要通过自定义顶点着色器阶段,带来不同的画面表现效果。
顶点着色器:是完全可编程的,进行一些操作就能带来如水波纹、布料等表现效果。
光栅化阶段
GPU主导,确定片元是否被渲染,并且确定片元的最终渲染颜色效果等。
我们主要通过自定义片元着色器阶段,带来如水面、火焰、黑白或模糊等效果。
-
三角形设置:计算三角形网格的表示数据,人话就是把顶点连成三角形。
-
三角形遍历:检查哪些像素被三角形网格覆盖了,覆盖就生成为一个片元,最终获得片元序列。
-
片元着色器(可编程):
-
逐片元操作(输出合并阶段,可配置):