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

有了开篇的渲染管线和渲染流水线的基本概念,接下来先从原理上看看渲染流水线是怎么运作的,然后再看看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。

平面阴影


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

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

【渲染流水线】主线索引-从数据到图像以UnityURP为例的更多相关文章

  1. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线 学习目标 了解几个用以表达真实场景的标志和2D图像 ...

  2. Shader 入门笔记(二) CPU和GPU之间的通信,渲染流水线

    渲染流水线 1)应用阶段(CPU处理) 首先,准备好场景数据(摄像机位置,视锥体,模型和光源等) 接着,做粗粒度剔除工作. 最后,设置好每个模型的渲染状态(使用的材质,纹理,shader等) 这一阶段 ...

  3. 《UnityShader入门精要》学习笔记之渲染流水线

    第一种分类方式: 图形管道(如下7步): 顶点数据 : 由3D模型传递的三角形网格 顶点着色 : 编写CG程序对各个顶点进行着色 生成几何图元 : 连接特定的顶点生成几何图元,例如连接三个顶点生成一个 ...

  4. Unity Shader入门精要学习笔记 - 第2章 渲染流水线

    来源作者:candycat   http://blog.csdn.net/candycat1992/article/ 2.1 综述 渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏 ...

  5. .net下灰度模式图像在创建Graphics时出现:无法从带有索引像素格式的图像创建graphics对象 问题的解决方案。

    在.net下,如果你加载了一副8位的灰度图像,然后想向其中绘制一些线条.或者填充一些矩形.椭圆等,都需要通过Grahpics.FromImage创建Grahphics对象,而此时会出现:无法从带有索引 ...

  6. 移动端 像素渲染流水线与GPU Hack

    什么是 像素渲染流水线 web页面你所写的页面代码是如何被转换成屏幕上显示的像素的.这个转换过程可以归纳为这样的一个流水线,包含五个关键步骤: 1.JavaScript:一般来说,我们会使用JavaS ...

  7. Unity Shader 之 渲染流水线

    Unity Shader 之渲染流水线 什么是渲染流水线 一个渲染流程分成3个步骤: 应用阶段(Application stage) 几何阶段(Geometry stage) 光栅化阶段(Raster ...

  8. Unity 渲染流水线 :CPU与GPU合作创造的艺术wfd

    前言 对于Unity渲染流程的理解可以帮助我们更好对Unity场景进行性能消耗的分析,进而更好的提升场景渲染的效率,最后提升游戏整体的性能表现 Unity的游戏画面的最终的呈现是由CPU与GPU相互配 ...

  9. 对索引像素格式的图片进行Setpixel(具有索引像素格式的图像不支持SetPixel)解决方案

    最近编写了一个验证码识别软件.其中对png.jpg图片进行二值化处理时,出现了错误:具有索引像素格式的图像不支持SetPixel解决方案.从字面上来看,这说明我对一个具有索引色的图片进行了直接RGB颜 ...

  10. Elasticsearch .Net Client NEST 索引DataSet数据

    NEST 索引DataSet数据,先序列化然后转成dynamic 类型进行索引: /// <summary> /// 索引dataset /// </summary> /// ...

随机推荐

  1. 计算机图形学——Games101深度解析_第一章

    写在前面 关于Games101深度解析参考了很多佬的文章,并且加上了自己的理解.主要感觉games101课程里面还有很多由于时间原因都没讲的很详细,略过了很多,所以我对于课程中困难的知识点进行了更多的 ...

  2. 参加 Hugging Face 组织的 Gradio & MCP 智能体主题黑客松

    欢迎参加 Gradio & MCP 智能体主题黑客松! 准备好了吗?一场以智能体(Agent)和模型上下文协议(Model Context Protocol,简称 MCP)为核心的全球在线黑客 ...

  3. 重磅预告 | 开源家族又添新成员!12月16日Molecule在Github、Gitee等你

    ​ 随着全球开源生态的持续性发展,开源项目数量呈现指数级的增长,并逐渐覆盖全栈技术领域.袋鼠云数栈技术开源团队一直秉承着"源于开源 回馈开源"的理念,坚持以技术为核心,开源开放.不 ...

  4. 五、kernel修改屏幕配置

    2.3.修改屏幕配置 2.3.1.配置 gpio 修改 ./rk_linux_sdk/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10. ...

  5. Kafka入门实战教程(5):吞吐量与可靠性的实践

    1 提高Producer吞吐量的实践 在实际环境中,用户似乎总是愿意用较小的延时增加的代价,去换取 TPS 的显著提升.毕竟,从 2ms 到 10ms 的延时增加通常是可以忍受的. 事实上,Kafka ...

  6. [Thingsboard] 1. 源码的下载和编译

    一.前言 本文基于 Thingsboard 4.0.2 编写,对应提交Version set to 4.0.2(01c5ba7d37006e1f8a3492afbb3c67d017ca8dd3). 最 ...

  7. 卷积神经网络(LeNet)

    博客地址:https://www.cnblogs.com/zylyehuo/ 一.导入所用库 import torch from torch import nn from d2l import tor ...

  8. leetcode 5 最长回文串

    简介 使用中心扩散法, 发现我的代码有很多的bug.改了很久 简单来说动态规划, 不如 中心扩散法来的容易理解. code class Solution { public: string longes ...

  9. python 简单socket

    简介 python 简单socket code import socket HOST = '103.46.128.53' PORT = 24876 BUFSIZ = 1024 ADDR = (HOST ...

  10. 多源异构数据源融合怎么做?Join操作篇(2)

    在探讨多源异构数据融合的过程中,除了上篇介绍的通过Union方式实现的数据整合之外,Join操作同样是一种非常重要的手段.如果说Union是从横向角度将不同来源但结构相似的数据集合起来的话,那么Joi ...