【渲染流水线】[光栅阶段]-[光栅插值]以UnityURP为例
- 作用:将几何图元(三角形)转换为片元(Fragment),并插值顶点属性(如纹理坐标)
- 可配置:通过
Cull指令控制面片剔除模式(Back/Front/Off)。
【从UnityURP开始探索游戏渲染】专栏-直达
三角形设置 Triangle Setup
预先计算全局系数
- 优化遍历效率;实时计算则结合像素位置完成动态插值,确保透视正确性。
输入:
- 屏幕坐标系下的三角形顶点坐标(包含深度值
z) - 关联属性:法线、纹理坐标、顶点颜色等
生成:
- 计算边界框:确定三角形在屏幕上的最小/最大像素范围(
x_min,y_min至x_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)同时处理多个像素的重心坐标
典型数据流路径为:
UniversalRenderer → Shader.Draw → GPU光栅化器 → 片元着色器(接收插值后数据
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)
【渲染流水线】[光栅阶段]-[光栅插值]以UnityURP为例的更多相关文章
- 《UnityShader入门精要》学习笔记之渲染流水线
第一种分类方式: 图形管道(如下7步): 顶点数据 : 由3D模型传递的三角形网格 顶点着色 : 编写CG程序对各个顶点进行着色 生成几何图元 : 连接特定的顶点生成几何图元,例如连接三个顶点生成一个 ...
- Unity Shader入门精要学习笔记 - 第2章 渲染流水线
来源作者:candycat http://blog.csdn.net/candycat1992/article/ 2.1 综述 渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏 ...
- Unity 渲染流水线 :CPU与GPU合作创造的艺术wfd
前言 对于Unity渲染流程的理解可以帮助我们更好对Unity场景进行性能消耗的分析,进而更好的提升场景渲染的效率,最后提升游戏整体的性能表现 Unity的游戏画面的最终的呈现是由CPU与GPU相互配 ...
- Shader 入门笔记(二) CPU和GPU之间的通信,渲染流水线
渲染流水线 1)应用阶段(CPU处理) 首先,准备好场景数据(摄像机位置,视锥体,模型和光源等) 接着,做粗粒度剔除工作. 最后,设置好每个模型的渲染状态(使用的材质,纹理,shader等) 这一阶段 ...
- Unity Shader 之 渲染流水线
Unity Shader 之渲染流水线 什么是渲染流水线 一个渲染流程分成3个步骤: 应用阶段(Application stage) 几何阶段(Geometry stage) 光栅化阶段(Raster ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线 学习目标 了解几个用以表达真实场景的标志和2D图像 ...
- 移动端 像素渲染流水线与GPU Hack
什么是 像素渲染流水线 web页面你所写的页面代码是如何被转换成屏幕上显示的像素的.这个转换过程可以归纳为这样的一个流水线,包含五个关键步骤: 1.JavaScript:一般来说,我们会使用JavaS ...
- GPU渲染流水线的简单概括
GPU流水线 主要分为两个阶段:几何阶段和光栅化阶段 几何阶段 顶点着色器 --> 曲面细分着色器(可选)----->几何着色器(可选)----->裁剪-->屏幕 ...
- OpenGL渲染流水线
其实OpenGL的流水线,对我学习来说只能算是一个概念性的东西.毕竟OpenGL也在发展,流水线也不会是一成不变的. 不过理解流水线的过程,重点在于理解每一步的作用,进而可以如何衔接起来,完成整个绘制 ...
- UML和模式应用4:初始阶段(4)--需求制品之用例模型模板示例
1. 前言 UP开发包括四个阶段:初始阶段.细化阶段.构建阶段.移交阶段: UP每个阶段包括 业务建模.需求.设计等科目: 其中需求科目对应的需求制品包括:设想.业务规则.用例模型.补充性规格说明.词 ...
随机推荐
- docker-compose用法
以下的示例搭建龙一个wordpress博客 services: mysql: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=123456 ...
- EasyExcel工具类,可导出单个sheet、导出多个sheet
单个sheet导出案例 ExcelUtil.exportXlsx(response, "测试数据", "测试数据", list, TestDataPageDto ...
- 「Note」模板速查
代码 #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long l ...
- Go标准库Cond
Go标准库的Cond Go 标准库提供 Cond 原语的目的是,为等待 / 通知场景下的并发问题提供支持.Cond 通常应用于等待某个条件的一组 goroutine,等条件变为 true 的时候,其中 ...
- python爬虫学习——urllib库
#获取一个get请求 #import urllib.request # response = urllib.request.urlopen("http://www.baidu.com&quo ...
- Git 操作进阶
1. git基本操作 1.1 查看文件 还未被add的更改 使用git status命令,它会显示哪些文件已经被修改并添加到暂存区,以及那些还未被添加的修改. git status -uno //不显 ...
- Hi,我是ChunJun,一个有趣好用的开源项目
Hi,我是ChunJun,一个有趣好用的开源项目. 今天我们正式开通了自己的公众号!欢迎大家关注~ 数字经济时代,各行各业数字化转型大趋势下,数据要素成为关键.海量多源异构数据汇聚,使得数据同步面临同 ...
- 未能加载文件或程序集“System.Runtime.WindowsRuntime, Version=4.0.14.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一个依赖项。不应出于执行的目的加载引用程序集。只能在仅限反射的加载程序上下文中加载引用程序集。 (异常来自 HRESULT:0x80131058)
VS项目编译时报错: 未能加载文件或程序集"System.Runtime.WindowsRuntime, Version=4.0.14.0, Culture=neutral, PublicK ...
- 探索学习Hypermesh的有效方法
大家好!我是一名Hypermesh的学习者,最近在学习这个强大的有限元前处理软件时,总结了一些有效的学习方法,希望能与大家分享. 1. 熟悉软件界面和工具:首先,我们需要熟悉Hypermesh的界面和 ...
- PTA 4-1
PTA 习题4-1 求奇数和 (15分) 本题要求计算给定的一系列正整数中奇数的和. 输入格式: 输入在一行中给出一系列正整数,其间以空格分隔.当读到零或负整数时,表示输入结束,该数字不要处理. ...