Unity 渲染流水线 :CPU与GPU合作创造的艺术wfd
前言
对于Unity渲染流程的理解可以帮助我们更好对Unity场景进行性能消耗的分析,进而更好的提升场景渲染的效率,最后提升游戏整体的性能表现
Unity的游戏画面的最终的呈现是由CPU与GPU相互配合产生的效果,总体上,两者直接的工作流程是一个流水线的模式,大概分为三个阶段:
- 应用程序阶段
- 几何阶段
- 光栅化阶段
其中应用程序阶段是由CPU来负责计算处理的,而几何阶段与光栅化阶段则是由GPU来进行处理执行的
注意:
- 本文章大部分内容来自于冯乐乐编写的:Unity Shader 入门精要,是一本不错的学习
shader的书
渲染流水线流程
一、应用程序阶段
在应用程序阶段,主要是CPU在进行一系列的处理操作,主要的几个关键步骤为:
1、数据准备工作
首先需要CPU从硬盘中读取场景中的数据,比如说摄像机位置、视锥体、场景中有哪些模型、使用了什么样的光源
CPU在获取到这些数据后,需要根据开发者对于场景中的相关参数的调整后获取到需要被渲染的数据添加给显存
哪些参数会影响被渲染物体数据量
- 视锥剔除:是
Unity默认的减少渲染物体的方式- 遮罩剔除:被遮挡的物体不进行渲染
2、设置渲染状态
这一阶段的目的是输出渲染需要的几何信息,即渲染图元
可以这样的简单解释,对于同一种模型,使用不同的材质,处于不同的光照条件下,模型产生的效果也是不同的,这些材质光照就是对于模型要使用哪种渲染状态的一种参数
3、调用Draw Call
前面在进行性能优化时,反复提到的一个点就是Draw Call,那么到底是什么一个东西呢
简单来说,Draw Call就是一个命令,一个由CPU发起,命令GPU执行的命令,就是CPU告诉GPU可以对某个模型进行渲染处理的传话人
关于Draw Call
- 简单来说,
Draw Call就是CPU调用图形编程接口,比如DirectX或OpenGL,来命令GPU进行渲染的操作,可以将Draw Call理解为一个命令
一般来说一个独立的模型会产生一个Draw Call,但是如果经过一些特殊的处理,比如所动态合批,静态合批等等操作,就会降低Draw Call
为什么
Draw Call会影响CPU性能
- 可以直接理解为两者对于数据处理数据不对等而造成的结果
CPU将Draw Call发往GPU过程中并不是很直接的就交给GPU,而是先将这些数据存到一个命令缓冲区内,然后再后面的几何阶段由GPU进行数据的读取GPU的渲染能力是很强的,渲染300个和3000个三角网格通常没有什么区别,因此渲染速度往往快于CPU提交命令的速度Draw Call的数量太多,CPU就会把大量时间花费在提交Draw Call命令上,造成CPU的过载
二、几何阶段
接下来就会来到GPU的处理范围,需要通过GPU来进行图形的渲染工作,大概流程如图:

在开始了解GPU流水线工作流程前,需要先理解输入顶点数据,我们在应用程序阶段将需要渲染的数据加载到了显存中,这样就可以方便GPU的数据调用,而关于具体使用显存中哪些数据,就是由Draw Call来决定的
1、顶点着色器
顶点着色器的处理单位是顶点,每一个输入的顶点都会调用一次顶点着色器,用于实现顶点的空间变换、顶点着色等功能
其需要完成的工作是,坐标变换和逐顶点光照:
- 坐标转换:通过坐标转换可以实现波动水面或者说
- 逐顶点光照:根据字面理解,即对每一个顶点融合场景中的光照信息
通过这样的处理,即可将处理后的数据传递给后续流程进行进一步的处理
2、曲面细分着色器:
·是一个可选择的着色器,用于细分图元(可以简单的理解为三角面)
3、几何着色器:
同样是可以选择的。用于执行逐图元着色的操作
4、裁剪
裁剪同样是将不在相机视锥外的部分去除掉,但是与之前的视锥剔除不同,在GPU层面的去除是微观的,基于一个个图元进行处理的
关于视锥剔除与遮罩剔除
- 两者是在应用程序阶段进行处理的,即CPU来处了,而处理的基本单元是一个个独立的物体,如果一个物体的一部分在视锥内,那么这个整个物体就不会被剔除
而关于一个图元(一般是三角面)的裁切的三种情况:
- 完全在视野内:不裁切
- 部分在视野内:裁切掉不在视野内的部分,并且与视野边缘处生成新的顶点
- 完全在视野外:直接裁切掉
这一步完全由硬件的固定操作来控制,无法通过编程来控制
5、屏幕映射
这一步的输入仍然是三维坐标系下的坐标,屏幕映射的任务是将每一个图元的x和y坐标转换到屏幕坐标系中,这一步的操作和我们显示画面的分辨率有很大的关系
屏幕映射得到的坐标决定了这个顶点对应屏幕上哪个像素以及激励这个像素有多远
三、光栅化阶段
光栅化阶段同样是由GPU进行处理,具体的处理流程为:

1、三角形设置:
首先从上一步获取处理完的信息
- 即屏幕坐标系下的顶点位置以及和他们相关的额外信息,如深度值法线方向,视角方向
然后开始正式处理:
- 计算光栅化一个三角网格所需的信息,即将这个三角网格的每一条边与屏幕像素点来对应起来,这样就会在边上产生一系列的点
2、三角形遍历:
这一阶段会检查每个像素是否被一个三角网格说覆盖,如果覆盖,则生成一个片元,这样一个找到哪些像素被三角形覆盖的过程就是三角形遍历
关于片元:
- 一个片元并不是真正意义上的像素,是一个包含很多状态的集合,比如说屏幕坐标、深度信息,以及从其他几何阶段输出的顶点信息,例如法线纹理坐标,这些状态用于计算每个像素的最终颜色
通过这样的处理后,最终输出一个片元序列,即所有像素的片元信息的集合
片元着色器:
这一步的目的可以简单的理解为,将前面所有的处理产生的数据转换为对应的颜色,这样就可以显示出最终的画面
这一阶段具体的操作细节:
- 纹理采样:通过顶点着色器输出的每个顶点对应的纹理坐标,然后经过光栅化阶段对应的三角网格的三个顶点对应的纹理坐标插值后,得到覆盖的片元的纹理坐标
逐片元操作:
作为渲染流程的最后一部分,其功能是对于每个片元进行一些操作:
- 决定每个片元的可见性:通过一些测试工作来实现:深度测试、模板测试
- 通过上一步测试,则对这个片元的颜色值和寂静存储在染色缓冲中的颜色进行合并,或者说混合
总结
整个流程看下来是比较晦涩难懂的,尤其是GPU处理阶段,大多数的概念、流程就像天书一样
但是在我们日常使用中,大部分流程是我们接触不到的,也没有办法通过参数去调整这些过程,我们只需要关注一些我们可以调整的模块流程的
同时,我们要理解那些影响游戏进程的一些关键点,比如说Draw Call的产生,以及为啥会影响游戏的性能,这样会帮助我们更好的去做一些性能优化的操作
Unity 渲染流水线 :CPU与GPU合作创造的艺术wfd的更多相关文章
- iOS离屏渲染的解释:渲染与cpu、gpu
重开一个环境(内存.资源.上下文)来完成(部分)图片的绘制 指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作 意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作. ...
- Shader 入门笔记(二) CPU和GPU之间的通信,渲染流水线
渲染流水线 1)应用阶段(CPU处理) 首先,准备好场景数据(摄像机位置,视锥体,模型和光源等) 接着,做粗粒度剔除工作. 最后,设置好每个模型的渲染状态(使用的材质,纹理,shader等) 这一阶段 ...
- Unity渲染优化中文翻译(二)——CPU的优化策略
紧接上一篇文章,继续渲染的优化问题,若有错误,请指出,让我也学习进步,谢谢. 如果游戏渲染问题来自CPU 概括的来说,CPU在一帧的渲染中的工作可以分为三个部分: . 决定谁需要被渲染 . 为GPU准 ...
- Unity Shader 之 渲染流水线
Unity Shader 之渲染流水线 什么是渲染流水线 一个渲染流程分成3个步骤: 应用阶段(Application stage) 几何阶段(Geometry stage) 光栅化阶段(Raster ...
- Unity Shader入门精要学习笔记 - 第2章 渲染流水线
来源作者:candycat http://blog.csdn.net/candycat1992/article/ 2.1 综述 渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏 ...
- 移动端 像素渲染流水线与GPU Hack
什么是 像素渲染流水线 web页面你所写的页面代码是如何被转换成屏幕上显示的像素的.这个转换过程可以归纳为这样的一个流水线,包含五个关键步骤: 1.JavaScript:一般来说,我们会使用JavaS ...
- Unity渲染优化中文翻译(三)——GPU的优化策略
如果游戏的渲染瓶颈来自于GPU 首要任务就是找出造成GPU瓶颈的因素所在,通常GPU的性能受到像素分辨率的影响,特别是在移动客户端的游戏,但是内存带宽和顶点计算的影响也需要注意.这些因素的影响都需要实 ...
- Shader 入门笔记(二) CPU和GPU之间的通信
渲染流水线的起点是CPU,即应用阶段. 1)把数据加载到显存中 2)设置渲染状态,通俗说这些状态定义了场景中的网格是怎样被渲染的. 3)调用DrawCall,一个命令,CPU通知GPU.(这个命令仅仅 ...
- Unity渲染优化中文翻译(一)——定位渲染问题
最近有一点个人的时间,尝试一下自己翻译一下英文的 Optimizing graphics rendering in Unity Games, 这儿附上英文链接: 个人英文水平有限,unity图像学知识 ...
随机推荐
- 科普NGK公链生态板块旗下的BGV、SPC、NGK、USDN四大币种
众所周知,NGK公链所有数据上链.公开透明,NGK公链生态板块目前主要分为四个板块---BGV.SPC.NGK.USDN四大币种,笔者以时间上倒叙手法来一一科普. 首先,是2021新年刚推出的SPC侧 ...
- 直播预告 | 全面的审计分析和权限管控——CloudQuery年终发布!
2020年9月,CloudQuery 发布. 针对开发.运维人员面临的如何高效便捷访问.操作管理数据的问题,我们设计并研发了云原生安全数据操作平台,CloudQuery 就此诞生! 2020年结束之际 ...
- Zookeeper从入门到删库跑路
导语 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项 ...
- TERSUS无代码开发(笔记06)-简单实例手机端页面设计
手机端的设计 1.页面说明 2.默认页面===>提交请假单(上面页面双击进入,页面主要编辑区) 2.1默认页面===>提交请假单===>头部区(页面部份主要编辑区01) 2.1.1默 ...
- Vue学习笔记-vue-element-admin 按装报错再按装
一 使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7 (Windows x86- ...
- Qt+opencv亲自配置教程
了别人的配置,总是无法配置成功,自己慢慢摸索配置成功.我失败的原因是在于自己本机的环境变量和他们不同,特此记下,分享给有相同问题的朋友. 一.需要软件 1.cmake 3.11.3(版本无所谓) 2. ...
- 关于VsCode创建Vue基础项目的步骤以及相关问题
项目创建步骤: 1. 全局安装vue-cli 安装命令: npm install -g vue-cli 在vscode上打开一个终端,然后输入此命令(下为截图): 2. 安装webpack,打包js ...
- 微信小程序折线图表折线图加区域图
1.先来个效果图 这里我用的是插件@antv/f2-canvas(安装的方法如下) npm init 此处如果直接使用官方npm install 可能会出现没有node_modules错误 npm i ...
- 如何在 C# 中使用 const,readonly,static
平时在开发时经常会用到 const,readonly,static 关键字,可以肯定这些关键词是完全不同的概念,但有时候他们在用法上很相似以至于在场景中不知道选择哪一个,这篇文章我们就来讨论 C# 中 ...
- 锐捷RG-UAC统一上网行为管理审计系统账号密码泄露漏洞 CNVD-2021-14536
一:产品介绍: 锐捷 RG-UAC 统一上网行为管理审计系统 锐捷统一上网行为管理与审计RG-UAC系列是星网锐捷网络有限公司自主研发的上网行为管理与审计产品,以路由.透明.旁路或混合模式部署在网络的 ...