前段时间在看Shader Graph的时候,发现很多基本概念搞不懂,于是刨了一下Unity的的渲染过程,权当复习计算机图形学了。毕竟奔五的老头了,年事渐高,记性也越发不济,便把学到的东西整理成了这篇笔记。其中若有疏漏或错误之处,还恳请不吝指正。
文章目录
一、Unity的渲染的过程包含哪几个阶段?
包含以下四个阶段:应用程序阶段、几何阶段、光栅化阶段、像素处理阶段
每个阶段包含哪些操作:
二、扫清障碍——基本概念解释
1、缓冲区(Buffer)
【缓冲区】这个词出现在【像素处理阶段】,讲的是在像素处理阶段,GPU会把像素信息包(又名“片段”)进行渲染,选然后依据深度信息进行评判,剔除一些看不见的信息,然后把要显示的信息更新到帧缓冲区里面(它有颜色、深度、模板三个缓冲区组成)。
渲染管线中,是用来临时存储数据的内存区域。存储的对象是渲染过程中产生的像素、深度、颜色等信息。
(1)缓冲区
渲染管线中,是用来临时存储数据的内存区域。存储的对象是渲染过程中产生的像素、深度、颜色等信息。
(2)帧缓冲区
一个综合的缓冲区,可能包含颜色缓冲区、深度缓冲区和模板缓冲区,用于存储最终的渲染结果。该缓冲区它是一个逻辑概念,不是物理结构,它实际由颜色、深度、模板三个缓冲区构成。
(3)颜色缓冲区(Color Buffer)
存储每个像素的颜色信息(RGB或RGBA)。这是渲染后直接影响屏幕显示的主要缓冲区。
(4)深度缓冲区(Depth Buffer)
也叫Z缓冲区,存储每个像素的深度值(距离相机的远近),用于确定哪些物体在其他物体前面,解决遮挡问题。
(5)模板缓冲区(Stencil Buffer)
用于存储模板值,常用于实现特定的渲染效果,如遮罩、轮廓、反射等。
(6)缓冲区的示意图
(7)帧缓冲区与颜色、深度、模板缓冲区的关系
(8)帧缓冲区是全局公用的吗?是的
(9)什么是【深度测试】?
像素处理阶段:深度测试解决基本的空间遮挡,判断某像素坐标处的几个【片段】的【深度值】,保留近的,舍弃远的。
(10)什么是【模板测试】?
像素处理阶段:模板测试则用于实现局部渲染、遮罩、轮廓线等定制化效果
2、Unity中的MeshFilter和MeshRenderer渲染组件
(1)MeshFilter组件
- 意为“网格过滤器”或者“网格提供者”
- 这个组件,界定了一个物体的外形,外形的意思就是物体的几何数据——顶点数据(位置、UV、法线、切线),以及面数信息(三角形索引信息)。
- 只提供数据,不处理渲染逻辑。
(2)MeshRenderer组件
- 网格渲染组件
- MeshRenderer 是一个 Unity 组件,负责将 MeshFilter 提供的几何数据提交给渲染管线,并结合材质(Material)进行渲染。
- 它的作用 :
-
- 提交渲染命令:将 MeshFilter 的网格数据和材质信息传递给 URP,触发渲染。
-
- 定义外观:通过材质和 Shader 控制物体的颜色、纹理、光照效果(如漫反射、镜面高光)。
-
- 控制渲染行为:设置渲染队列(不透明/透明)、阴影投射/接收、光探针使用等。
3、几何阶段的相关概念
(1)几何阶段是做啥的?
几何阶段用到的信息来自哪里
在 Unity 的 URP(通用渲染管线,Universal Render Pipeline) 中,几何阶段(Geometry Stage) 的输入是 3D 模型的网格数据及其相关属性,具体由 MeshFilter 和 MeshRenderer 组件提供的数据组成,但这些组件本身不是直接输入,而是通过它们在应用程序阶段准备的数据传递到 GPU把场景中要渲染的物体,在【顶点着色器】的加持下,经过历次空间坐标变换,从把要渲染的物体从模型空间——>世界空间——>相机空间——>裁剪空间——>屏幕空间,逐次变换。
进行图元组装:把3D物体切碎成基本的渲染图形,最后组装成一个又一个的信息包。
裁剪操作:把看不见的图元删除
(2)什么是图元?
图元的这个词的来源: 来自英文“Primitive”,意思是【原始的】、【基本的】,在图形学中指【渲染管线中最基本的几何形状】,如三角形(Triangle)、线段(Line)、点(Point)。或者改为【基本图形】、【绘制单元】更好理解。
图元包含的信息:
(3)几何计算阶段会产生大量的图元?
在几何处理中,确实会根据需求生成大量图元,且这些图元通常以最基础的图形(点、线段、三角形)为单位。这是因为复杂的几何模型或场景往往需要通过这些 “最小单元” 来精确描述,同时也便于计算、渲染和存储。
(4)什么是【顶点变换】?
顶点变换就是把场景里要渲染的物体,不断地进行坐标变换,是他们从模型坐标,变换到屏幕坐标。有【顶点着色器】完成。
(5)什么是【模型空间】、【世界空间】、【相机空间】、【裁剪空间】、【屏幕空间】?
(6)什么是【顶点着色器】
(7)什么是【图元组装】
4、光栅化相关概念
(1)什么是【光栅化】
CRT显示器在显示图像的时候,电子枪逐行扫射屏幕上的荧光点,屏幕被颜色“格子”填满后,便产生了图像。这个过程以前叫“光栅化”。
(2)光栅化的作用
(3)什么是【片段】
- 背景知识:
1、【光栅化】阶段把【图元】处理成【片段】。
2、【光栅化】就是把【裁剪空间】的数据处理成【屏幕空间】的数据。
屏幕空间中的每个像素点,要显示内容为裁剪空间中对应位置的物体信息,一个像素点要显示的内容可能不止一个,那么,这些要显示在某个像素点的一个或者多个内容,就是片段。
(4)为什么叫【片段】
为什么叫片段?
【光栅化】阶段的扫描工作,把一个3D图元“切碎”成覆盖屏幕像素的小块。每个小块对应一个像素,就是一个“片段”。
(5)【片段】包含写什么信息(结构)
5、像素处理阶段(片段着色阶段)
(1)什么是【像素处理阶段】
像素处理阶段(Fragment Processing Stage) 是渲染管线的核心阶段,由 GPU 执行,负责处理光栅化阶段生成的片段(Fragment),为每个像素计算最终颜色并决定渲染结果。
(2)【像素处理阶段】的处理流程是啥?
(3)【像素处理阶段】的几个缓冲区概念
(4)什么是片段着色器
- 定义: 片段着色器是一个可编程的 GPU 程序,处理光栅化阶段生成的片段,计算每个片段的颜色(RGBA)和其他输出(如深度或模板值),决定像素在屏幕上的最终外观。
- 位置: 运行在像素处理阶段,在光栅化阶段(生成片段)之后,后处理阶段(如颜色分级)之前。
- 核心特点:
逐片段处理:每个片段独立运行一次片段着色器。
主要输出颜色值,供后续测试和写入渲染目标(如颜色缓冲区)。
三、一个案例的渲染流程
- Unity
- URP
- 单相机
- 场景有三个立方体A、B、C