当前位置: 首页 > ai >正文

【渲染流水线】主线索引-从数据到图像以UnityURP为例

前情提要

【开篇导览】探索游戏渲染从UnityURP开始-CSDN博客

有了开篇的渲染管线和渲染流水线的基本概念,接下来先从原理上看看渲染流水线是怎么运作的,然后再看看UnityURP是对应是怎么实现的,最后再看UnityURP是怎么构建渲染管线,逐层探索剖析。本篇作为渲染流水线的主线文章,将列举渲染流水线中的各个阶段,将数据到图像的每一步处理步骤都列出,每个阶段的具体的详细讨论在后续相应的文章链接中展开详解。

对渲染的探索是个持续不断完善的过程,记录这个过程将零散的内容整理起来,其中肯定会有理解偏差和问题,如果哪里有问题,欢迎在评论区探讨和指出)

基于URP默认的渲染路径:前向渲染Forward 来讲解基本的渲染流水线

渲染路径 概念在最后会讲解,默认的前向渲染路径就是最通用的复合常规的渲染流水线中的流程,其他路径都是优化特定情况而出现的,先用前向的学习后再看其他的渲染路径。

渲染流水线(Rendering Pipeline)中可编程或可配置阶段,按顺序执行:

应用阶段 -〉几何阶段 -〉 光栅化阶段 -〉逐片元阶段 -〉输出

应用阶段(CPU)包括(包围盒裁剪、遮挡剔除、其他裁剪算法等)

几何阶段(GPU)包括(顶点着色器(可编程)、细分着色器(可选)、几何着色器(可选)、图元装配(固定)、裁剪(固定)、归一化设备坐标(透视除法;固定)、屏幕映射(固定))

光栅化阶段(GPU)包括(光栅化(三角形设置、三角形遍历;固定)、片元着色器(可编程))

逐片元阶段(GPU)包括((可见性测试Scissor、多重采样测试)透明度测试、模版测试、深度测试、深度写入、混合)(全可配置)


接下来详细列出渲染流水线的阶段索引

应用阶段

  • 包围盒裁剪

  • 遮挡剔除

  • 其他裁剪算法

  • 渲染命令队列和其中的渲染指令(drawcall)、渲染状态设置

几何阶段

  • 关键顺序‌:

  1. 顶点着色器输出齐次裁剪坐标(如 UnityObjectToClipPos 返回值)‌。
  2. GPU执行裁剪(依赖 w 分量的动态范围)‌。
  3. 透视除法触发归一化‌,生成NDC坐标供屏幕映射‌

模型空间 →(Model矩阵)→ 世界空间 →(View矩阵)→ 观察空间 →(Projection矩阵)→ ‌裁剪空间‌→(透视除法)→ ‌NDC空间‌ →(视口变换)→ 屏幕空间

  • 其中模型空间到裁剪空间是在顶点着色阶段运算的。(在顶点着色器中手动用MVP矩阵进行左乘计算)
  • NDC空间是归一化时做的 (GPU自动计算)
  • 屏幕空间是屏幕映射阶段做的 (GPU自动计算)

  • 顶点着色器(Vertex Shader)‌

  • 可选阶段:曲面细分着色器(Tessellation Shader)‌

  • 可选阶段:几何着色器(Geometry Shader)‌

  • ‌图元装配

  • 裁切

  • 归一化设备坐标(Normalized Device Coordinates, NDC)

  • 屏幕映射

光栅化阶段

  • 光栅化‌

  • 片元着色器(Fragment Shader)‌

逐片元阶段

  • 逐片元操作(Per-Fragment Operations)‌

  • 深度偏移(Slope Scale Depth Bias)‌

  • 渲染顺序与层级


Unity中基于SRP的URP渲染管线

  • SRP提供的核心功能与架构‌

  • URP在SRP上的具体实现‌

  • URP对SRP的扩展与简化‌

  • 对URP的扩展

  • URP中的渲染路径选择‌


其他

  • URP中实时阴影计算流程

  • 计算着色器(Compute Shader)‌:GPU 通用计算,可并行处理非图形任务(需单独编写)。

  • 后处理(Post-Processing)‌:屏幕空间特效(如 Bloom),通过 URP Renderer Feature 添加。

  • 投影Projector。

  • 平面阴影


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

http://www.xdnf.cn/news/17055.html

相关文章:

  • Kafka 的基本操作(1)
  • Go语言实战案例:使用sync.Mutex实现资源加锁
  • 解决docker load加载tar镜像报json no such file or directory的错误
  • 安科瑞智慧能源管理系统在啤酒厂5MW分布式光伏防逆流控制实践
  • Redis协议数据迁移方式
  • 基于华为开发者空间的Open WebUI数据分析与可视化实战
  • 一次“无告警”的服务器宕机分析:从无迹可寻到精准定位
  • Java技术栈/面试题合集(8)-Redis篇
  • linux服务器上word转pdf后乱码问题
  • 如何对云环境或者超融合系统进行性能测试?
  • Java项目:基于SSM框架实现的公益网站管理系统【ssm+B/S架构+源码+数据库+毕业论文+答辩PPT+远程部署】
  • Python 3.13 预览版:颠覆性特性与实战指南
  • Spring 的依赖注入DI是什么?
  • Starrocks中的 Query Profile以及explain analyze及trace命令中的区别
  • 力扣经典算法篇-43-全排列(经典回溯问题)
  • SpringCloud学习------Gateway详解
  • 数据结构 | 树的秘密
  • WPF 与 Winform :Windows 桌面开发该用谁?
  • 剖析 DC - DC 电路 SW 节点铺铜面积大小的利弊
  • Redis集群模式下确保Key在同一Slot的实现方法
  • 依托CGA匹兹堡睡眠质量指数,优化老年睡眠干预方案​
  • 【面试场景题】日志去重与统计系统设计
  • 复制网页文字到Word、WPS文字?选中后直接拖放
  • PowerShell 入门2: 使用帮助系统
  • Apifox使用mock模仿后端返回数据
  • 基于ZYNQ ARM+FPGA的声呐数据采集系统设计
  • Go语言 定时器
  • 数据结构---Makefile 文件(格式、文件变量、调用、伪目标)、gcc编译的四个步骤、双向链表(概念、作用、应用)
  • Android 之 Kotlin中的kapt
  • 风丘助力混合动力汽车工况测试:精准采集整车信号解决方案