【TA-霜狼_may-《百人计划》】图形3.72command buffer 及urp概述

  • @[TOC](【TA-霜狼_may-《百人计划》】图形3.72command buffer 及urp概述
  • 3.7.2.1 Command buffer 简介
    • 为什么会有command buffer
    • Unity中Command Buffer的使用
  • 3.7.2.2 从自定义RenderPipeline分析ScriptableRenderContext 与 CommandBuffer
    • RenderPipeline结构
    • 在Project中创建出RenderPipeline.Asset
    • Renderer
    • ScriptableRenderContext
    • 渲染状态的更新(RenderStateBlock)
  • Command Buffers in Unity
    • 官方毛玻璃案例分析:
      • 原理分析:
      • 存在问题:
      • 代码实现
    • 总结
  • 作业
    • 展开传送门效果

3.7.2.1 Command buffer 简介

Command buffer: 用来存储渲染命令的缓冲区。
Command buffer保存着渲染命令列表,如(set render target,draw mesh等等),可以设置在摄像机渲染期间的不同点执行。

为什么会有command buffer


利用Command buffer帮助我们告诉管线进行什么样的绘制操作。

在OpenGL中,渲染过程中,出于渲染流程的需要,会频繁绑定VAO,VBO,FBO这类Buffer Object。这样重复性的操作即繁琐也缺乏可扩展性。

因此可以对一些重复性的操作进行提取封装:使用Shader类负责编译,在Model类添加一些读取模型,绑定VAO,VBO操作函数等等。

把渲染流程分为一个一个Pass进行编写,更加容易辨识在每个渲染流程中应该做什么,计算出什么结果。

出于跨平台的需要,unity对底层api进行进一步的处理,就得到了CommandBuffer。

Unity中Command Buffer的使用

回到Unity中,打开FrameDebugger,可以看到场景的渲染流程。对应ForwardRenderer.cs脚本中的

流程 对应Pass
MainLightShadowCasterPass m_MainLightShadowCasterPass
DepthOnlyPass m_DepthPrepass
ColorGrandingLutPass m_ColorGradingLutPass
DrawObjectsPass m_RenderOpaqueForwardPass
DrawSkyboxPass m_DrawSkyboxPass
CopyColorPass m_CopyColorPass
PostProcessPass m_PostProcessPass
PostProcessPass m_FinalPostProcessPass

上表对应默认的URP管线
为了更好地扩展unity渲染管线,unity提供了CommandBuffer,让你根据自己的需求,在不同的渲染阶段插入绘制指令,例如:DrawRenderer,DrawMesh,DrawProcedure,绘制的时候也可以根据需要设置绘制时材质(Material)的MaterialPropertyBlock更改当前绘制的材质属性。

图中利用RenderFeature在BeforeRenderingOpaques的时候利用DrawMesh指令渲染了一个Box。
MaterialPropertyBlock比直接修改Material的优势是:不会创建出新的材质实例。

3.7.2.2 从自定义RenderPipeline分析ScriptableRenderContext 与 CommandBuffer

本节从最简单的自定义RenderPipeline开始分析如何构造一个Scriptable Render Pipeline。
然后再分析Pass的概念以及CommandBuffer和ScriptableRenderContext之间的关系。

RenderPipeline结构


首先先写一个继承自RenderPipeline的自定义管线类,类中有一个CameraRenderer对象,CameraRenderer朱啊哟负责的是渲染的主要逻辑。

继承自RenderPipeline的Render方法需要重写,可以看到这里的Cameras是一个数组,说明了当场景里有多个相机时,需要我们在这个RenderPipeline的Render函数中去遍历所有的Camera进行一个处理操作。

在Project中创建出RenderPipeline.Asset

为了创建一个Asset文件,只需要集成RenderPipelineAsset以及在类前面添加一个Attribute标签表示创建的资源在哪一个创建的列表的哪一个位置。

当然,这个继承RenderPipelineAsset也必须要实现CreatePipeline方法,并且返回一个RenderPipeline实例。

Renderer

最后就是负责主要渲染逻辑的Renderer类,直译过来就是渲染器,渲染器的Render方法的参数可以根据需求进行设置。可以看到在Render函数中朱啊哟的工作就是使用CommandBuffer把渲染过程相关指令写入到ScriptableRenderContext,最后ScriptalbeRenderContext使用Submit提交指令。为了方便组织渲染的流程和复用,可以把其中渲染的一段流程抽离出来单独写作一个Pass。

ScriptableRenderContext

在正式说Commandbuffer的作用之前,必须先清除ScriptableRenderContext在SRP中的作用。
ScriptableRenderContext: Defines state and drawing commands that custom render pipelines use.use a ScriptableRenderContext to schedule and submit state updates and drawing commands to the GPU.
指定自定义渲染管线渲染时的渲染状态和声明绘制指令,ScriptableRenderContext 负责调度和提交渲染状态的更新以及绘制指令到GPU。

说到渲染状态,在使用Opengl的时候,我们有时候也会根据渲染需要使用glEnable(xxxxx)更改渲染状态,使用BindVAO/VBO或者FBO/RBO这些命令,告诉GPU绘制的状态以及需要拿什么数据进行绘制,以及绘制到哪里。

渲染状态的更新(RenderStateBlock)


对于渲染状态的更新,体现最明显的是在context.DrawRenderers这个指令,可以看到DrawObjectPass在构造函数中它的RenderStateBlock是Nothing。

所以它对于Opaque pass也好,Transparent pass也好,它渲染状态的更新是跟每个Shader中各自的Depth、ZWrite、Blend等等的状态设置有关。
而下面的StencilState则是与在ForwardRenderer中的ForwardRendererData的具体设置有关。

context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref filterSettings, ref m_RenderStateBlock);

这个函数是最常见用于绘制一批物体,在SRP中,

  1. CullingResult是记录对物体,灯光,反射探针进行剔除的
  2. DrawingSetting设置绘制顺序以及绘制时使用哪一个Shader中的Pass
  3. FilteringSetting设置过滤设置渲染指定的Layer,
  4. RenderStateBlock更改(StateBlock)来重载深度、模板写入方式。

Command Buffers in Unity

Command Buffers 出现的目的是为了扩展Unity的渲染管线(Rendering Pipeline) ,一个Command Buffer 中存储很多绘制命令(Rendering Command),这些 Rendering Command 其实就是OpenGL或者DirectX 中的一些列指令,比如glDrawElement,glClear等。
Command Buffer 扩展渲染管线的方法是:预定义一系列的渲染指令,然后在特定的时机去执行这些指令。
这些特定的时机是由我们来自定义指定的,下图渲染过程中的绿点说明了这些可以指定的时机:

Skybox的渲染是在不透明图像效果之后,半透明物体之前。
因为不透明物体的绘制是从前往后,而半透明物体的绘制是从后往前的。Command buffers 可以用来代替 Image Effect ,也可以和Image Effect 一起使用。

官方毛玻璃案例分析:

效果如图:

原理分析:

  1. 在不透明物体和天空盒渲染完成之后,复制渲染图像到一个临时的RT(RenderTexture)上,然后对其进行模糊处理,将处理的结果应用到一个Shader全局参数上。
  2. 这么一来,所有在天空盒之后渲染的物体(例如所有的半透明物体)可以采样这个“模糊处理后的场景图像”。
    这种做法的效果类似 GrabPass ,但是比抓取屏幕的效率更高一些。

存在问题:

  1. 在Scene视图,目前并不能正确捕捉渲染结果,只能捕捉到天空盒。
  2. 在Android手机上测试,效果有些差别。

代码实现

CommandBufferBlurRefraction.cs

用于渲染毛玻璃的Shader:GlassWithoutGrab.shader

用于模糊的Shader:SeparableBlur.shader

总结

  1. Command Buffer功能非常强大,它不仅可以用来处理Render Texture,也可以用于直接渲染物体:使用CommandBuffer.DrawMesh 和CommandBuffer.DrawRenderer 两个API 来实现。两者不同之处在于:DrawMesh 可以手动指定变换矩阵,更加灵活,同时也更加复杂。
  2. 使用Command Buffer 渲染物体时,如果给 shaderPass 形参传递了 -1 值,将会执行Shader中的所有Pass,但是需要注意:
if (!(LightMode == nullLightMode == ForwardBaseLightMode == ForwardAdd)){// Command Buffer 执行的渲染结果会出现问题~;}
  1. 执行Command Buffer 的方法:

    • 使用Camera.AddCommandBuffer()为摄像机指定的渲染事件添加CommandBuffer;
    • 也可以使用Graphics.ExecuteCommandBuffer()立即执行或Graphics.ExecuteCommandBufferAsync(); 异步执行 。
  2. 在使用Command Buffer的时候,一定要特别注意执行的时机和渲染的先后顺序,避免出现不可预估的渲染结果。Command Buffer的特点是可以在指定的时机执行一些特殊的渲染操作,从而达到节省资源和实现特殊效果的目的。Command Buffer 固然好用,切记,不可为了Command Buffer 而刻意使用Command Buffer,这样往往得不偿失

百人里面的太干了啃不动,后半部分FrameBuffer的介绍看的框架目录里面提供的另一篇简短的博客。

作业

展开传送门效果

要点:

  • 传送门展开
  • 传送门模糊
  • 传送门与物体碰撞的描边

portal

【TA-霜狼_may-《百人计划》】图形3.7.2 command buffer简相关推荐

  1. 百人计划 图形2.1 色彩空间

    色彩发送器 色彩认知:光源是出生点,光源发出光线,光线通过直射反射折射等路径最终进入人眼.在接收到光线后,人眼产生了一系列化学反应.由此把产生的信号传入大脑,大脑对颜色产生了认知感知. 光的要素: 光 ...

  2. 百人计划 图形1.4 PC手机图形API介绍

    前言 电脑工作原理:电脑是有各种不同的硬件组成,由驱动软件驱使硬件进行工作.所有的如软件工程师都会直接或间接使用到驱动. 定义:是一个针对GPU的图形库,用于渲染2D.3D矢量图形的跨语言.跨平台的应 ...

  3. 百人计划 图形 2.5 BUMP图改进

    基础感念 凹凸贴图技术是对物体表面贴图进行变化然后再进行光照计算的一种技术.例如给法线分量添加噪音,或者在一个保存扰动值的纹理图中进行查找,这是一种提升物体真实感的有效办法,但却不需要额外的提升物体的 ...

  4. 百人计划 图形2.2 模型与材质基础

    渲染流水线大致过程 1.顶点数据输入到顶点着色器中进行相关的顶点计算,然后进行图元装配,通过点与点之间的关系将点进行连接.2.再到几何着色器(可选着色器)进行图元的增加,再到光栅化通过遍历像素点将一个 ...

  5. 【TA-霜狼_may-《百人计划》】图形3.4 延迟渲染管线介绍

    [TA-霜狼_may-<百人计划>]图形3.4 延迟渲染管线介绍 @[TOC]([TA-霜狼_may-<百人计划>]图形3.4 延迟渲染管线介绍 3.4.1 渲染路径 3.4. ...

  6. 【TA-霜狼_may-《百人计划》】图形4.5 DoF景深基础

    [TA-霜狼_may-<百人计划>]图形4.5 Dof景深基础 @[TOC]([TA-霜狼_may-<百人计划>]图形4.5 Dof景深基础 4.5.1 景深 离散圈 4.5. ...

  7. 【TA-霜狼_may-《百人计划》】图形2.7.2 GPU硬件架构概述

    [TA-霜狼_may-<百人计划>]图形2.7.2 GPU硬件架构概述 @[TOC]([TA-霜狼_may-<百人计划>]图形2.7.2 GPU硬件架构概述 GPU是什么 GP ...

  8. 技美 百人计划 (图形)1.1渲染流程

    技美 百人计划 (图形) 图形 1.1 渲染流水管线2.1数学基础 很早之前就有关注百人计划这个系列的课程,也跟着看到了2.几的教学但是一直没有写笔记,最近看到百人计划已经快更新完毕了,决定从头看一遍 ...

  9. 个人学习笔记 ——【技术美术百人计划】图形 2.1 色彩空间介绍

    个人学习笔记 --[技术美术百人计划]图形 2.1 色彩空间介绍 图形 2.1 色彩空间介绍 个人学习笔记 --[技术美术百人计划]图形 2.1 色彩空间介绍 图形 2.1 色彩空间介绍 一.色彩发送 ...

最新文章

  1. python sort函数key_Python:s.sort([cmp[, key[, reverse]]])
  2. 前端学习(2800):实现news-item的封装
  3. break continye
  4. mysql优化 坑_mysql之我们终将踩过的坑(优化)
  5. nginx配置文件祥解
  6. C++_类和对象_C++多态_多态案例1-计算器类_抽象父类---C++语言工作笔记071
  7. Windows 之dos命令
  8. 为啥vb被计算机二级取消,计算机二级vb考试是不是今年最后一年
  9. Cifar10数据集转换成jpg格式
  10. API文档打开显示'已取消到该网页的导航'的解决方法
  11. Spread 14.2.0 for WinForms
  12. Linux命令之杀掉被占用的端口号
  13. Windows10远程桌面登录——Teamviewer
  14. 计算机视觉领域顶级会议和顶级期刊
  15. 立体翻转效果海报怎么制作?PS详细步骤教程!
  16. 华为P40系列手机camera特性分析
  17. 公开我的信息过滤器!
  18. 一篇搞定企业级C++跨平台线程池
  19. java实现端口映射_Java BIO实现TCP端口转发(端口映射)功能源码
  20. 第十三届蓝桥杯大赛 python B组题解交流

热门文章

  1. eclipse导入工程报错Faceted Project Problem(1 item)
  2. 【解决方案】医院医疗安防视频监控系统搭建及集成统一管理方案介绍
  3. 【前端】JS的BOM和DOM,事件,表单验证案例
  4. 送你个低代码福利,错过要再等一年
  5. 第六章 使用scikit-learn构建模型
  6. Jumpserver部署+Ldap认证
  7. mysql怎么查询借阅相同图书_MySQL查询练习2
  8. 若伊Vue快速容器部署
  9. 明翰经验系列之管理篇V1.1(持续更新)
  10. 在键盘上怎么点出来上下居中的点?