【渲染流水线】[光栅阶段]-[光栅插值]以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开始探索游戏渲染】专栏-直达

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

相关推荐
玖玥拾2 天前
C# 语言进阶(十四)Unity UI界面开发 + 网络消息联动
服务器·开发语言·网络·ui·unity·c#·游戏引擎
野区捕龙为宠2 天前
Unity 持久化数据
unity·游戏引擎·lucene
郝学胜-神的一滴2 天前
[简化版 GAMES 101] 计算机图形学 17:纹理技术从基础原理到多场景实战应用
c++·unity·游戏引擎·图形渲染·three.js·opengl·unreal
_ZHOURUI_H_3 天前
MyFramework: 同样是 Unity 游戏开发框架,和 HTFramework 的设计取向有什么不同?(下)
unity·游戏引擎·游戏开发·游戏ui·手游开发
小贺儿开发4 天前
Unity 知识库智能问答系统(RAG)
人工智能·unity·ai·大模型·智能问答·知识库·互动
丁小未4 天前
基于MVVM框架的XUUI 扩展的UI管理系统教程
unity·mvvm·ui框架·xuui·ui管理器
丁小未5 天前
基于MVVM框架的XUUI HelloWorld 新手教程
unity·性能优化·c#·游戏引擎
丁小未5 天前
基于MVVM框架的XUUI MoreComplex案例
unity·c#
EQ-雪梨蛋花汤5 天前
【Unity笔记】VR 一体机画面锯齿、模型边缘闪烁、接缝抖动排查:MSAA、Mipmap、Render Scale、Z-Fighting 全流程记录
笔记·unity·vr
YigAin5 天前
Unity Spine 资源出现白边的解决办法
unity·游戏引擎·spine