【渲染流水线】[光栅阶段]-[光栅插值]以UnityURP为例

  • 作用‌:将几何图元(三角形)转换为片元(Fragment),并插值顶点属性(如纹理坐标)
  • 可配置 ‌:通过 Cull 指令控制面片剔除模式(Back/Front/Off)。

【从UnityURP开始探索游戏渲染】专栏-直达

三角形设置 Triangle Setup

预先计算全局系数

  • 优化遍历效率;实时计算则结合像素位置完成‌动态插值‌,确保透视正确性‌。

输入:

  • 屏幕坐标系下的三角形顶点坐标(包含深度值 z
  • 关联属性:法线、纹理坐标、顶点颜色等‌

生成:

  • 计算边界框 ‌:确定三角形在屏幕上的最小/最大像素范围(x_min, y_minx_max, y_max),限定后续遍历区域‌。
  • 生成边方程(效率低,用点积求重心方式判断替代的话这里不用求解这个):构建三角形三条边的线性方程(如 Ax+By+C=0),用于后续像素覆盖判断‌
  • 重心坐标分母项 ‌:预计算重心坐标插值所需的公共分母(如 1/(w0·α + w1·β + w2·γ)),避免遍历阶段重复计算‌(由于使用点积重心坐标求解重心和像素判断,其中解方程组时有一个共同的行列式分母需要点积计算,这里可以把分母预计算,下面阶段就可以直接用。 点积重心求解坐标下面的三角形遍历阶段有解释。)
  • 与像素位置无关的数学系数,供遍历阶段复用。

三角形遍历 Triangle Traversal (扫描变换 ScanConversion)

输入数据

  • 三角形设置阶段输出的网格表示数据‌

输出数据

像素覆盖检测

  • 遍历边界框内所有像素,通过边方程或重心坐标判断(点积重心坐标 求解代替叉乘面积求解加速优化运算)中心点是否在三角形内部‌

片元生成

对覆盖的像素创建片元(Fragment),包含以下状态:

  • 屏幕坐标 (x, y)
  • 插值后的深度值 z
  • 插值后的属性:法线、纹理坐标、颜色等‌

深度初筛

  • 初步计算片元深度,供后续深度测试使用‌

输出 片元序列(每个片元包含像素位置、深度及插值属性),传递至片元着色器‌

利用重心坐标权重混合顶点属性,确保纹理、颜色等平滑过渡‌:

属性pixel=α⋅属性A+β⋅属性B+γ⋅属性C

点积法重心坐标公式解析

URP中光栅化的具体过程举例

Unity URP的光栅化阶段,几何图元通过重心坐标公式转化为片元的过程:

三角形设置阶段

  • 首先计算三角形在屏幕空间的包围盒,确定潜在覆盖的像素范围。
  • 例如一个三角形顶点坐标为(100,200)、(300,400)、(200,500),其包围盒范围为x∈100,300,y∈200,500

三角形遍历与片元生成

  • 遍历包围盒内所有像素,通过重心坐标判断是否在三角形内。重心坐标公式为:
  • α + β + γ = 1 (α,β,γ ≥ 0)
  • 若像素(150,300)的重心坐标计算结果为α=0.4, β=0.3, γ=0.3,则该像素属于三角形。

透视校正插值

  • 使用公式对顶点属性进行插值:
  • f = (αf₀/w₀ + βf₁/w₁ + γf₂/w₂) / (α/w₀ + β/w₁ + γ/w₂)
  • 例如插值纹理坐标时,若三个顶点的w值为1.0、1.2、1.1,UV为(0,0)、(1,0)、(0,1),则像素(150,300)的UV插值结果为(0.28, 0.23)45。

具体案例:

  • 一个红色渐变三角形,顶点颜色分别为红(1,0,0)、绿(0,1,0)、蓝(0,0,1)。
  • 片元(200,350)的重心坐标为(0.5,0.3,0.2),插值后颜色为(0.5,0.3,0.2)。

光栅化在URP中的具体实现

核心类与方法

在URP管线中,相关逻辑由以下部分实现:

  • UniversalRenderer类 ‌:负责组织渲染流程,通过RenderOpaqueGeometry等方法触发光栅化
  • ShaderLibrary/Core.hlsl ‌:包含插值计算的底层实现,如InterpolateBarycentricCoords等工具函数
  • GPU固定功能单元 ‌:实际计算由硬件光栅化器完成,Unity通过CommandBuffer.DrawProcedural等接口触发

GPU加速机制

重心坐标计算通过以下方式实现硬件加速:

  • 由GPU的‌光栅化引擎(Rasterizer Engine)自动执行,属于固定管线功能
  • Unity通过ShaderPass中的HLSLPROGRAM声明插值变量(如Varyings结构体),驱动GPU完成插值
  • 计算过程优化为并行处理,每个流处理器(SM)同时处理多个像素的重心坐标

典型数据流路径为:
UniversalRendererShader.Draw → GPU光栅化器 → 片元着色器(接收插值后数据


【从UnityURP开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

相关推荐
WarPigs1 小时前
游戏签到系统
unity
小拉达不是臭老鼠4 小时前
Unity中的UI系统之UGUI
学习·ui·unity
万兴丶4 小时前
Coplay适用于 Unity 的“Al 代理”使用指南
unity·游戏引擎·ai编程
魔士于安7 小时前
Unity材质球大合集
unity·游戏引擎·材质
mxwin8 小时前
Unity Shader 冰面 Shader 制作原理与流程
unity·游戏引擎·shader
小拉达不是臭老鼠10 小时前
Unity中的UI系统之UGUI_登陆面板实现
ui·unity
郝学胜-神的一滴10 小时前
[简化版 GAMES 101] 计算机图形学 11:频域·卷积·抗锯齿
c++·unity·图形渲染·opengl·three·unreal
元气少女小圆丶1 天前
SenseGlove Nova 2+Unity开发笔记2
笔记·unity·游戏引擎
想不明白的过度思考者1 天前
Unity学习笔记——虚拟摇杆实现笔记(事件触发器的使用、UGUI 坐标转换)
笔记·学习·unity
魔士于安1 天前
unity volumefog带各种demo第一人称 wsad 穿墙控制
游戏·unity·游戏引擎·贴图·模型