前言
这节课非常干!!
建议可以先过一遍,然后了解更多urp管线知识后再来回顾。
up非常细心过了很多知识点。
由于水平有限,现阶段先简单归类下这节课讲了哪些大内容,后续回顾下。
课程地址:https://www.bilibili.com/video/BV13F411e7Ai
PPT地址:https://docs.qq.com/slide/DUUxtdE5GcEtwZmNm
项目地址:https://github.com/Thousandyearsofwar/CommandBufferDemo
没有太多参考内容的笔记(可折叠展开)
从自定义RenderPipeline分析ScriptableRenderContext与CommandBuffer
详细回顾下课程
重点在于以下四个测试
- CullingResults+DrawingSettings+FilteringSettings
- Override RenderStateBlock
- RenderType Match Subshader
- TagName+TagVlaues Match Subshader or Pass
相关代码:here
大致是使用ScriptableRenderPass做一些有意思的事情,如修改匹配物体的材质和深度模板测试规则等等
这里提供其他参考资料:
- 放牛的星星大佬翻译catlikecoding相关文章:https://zhuanlan.zhihu.com/p/333275514
- Scriptable Render Pipeline:https://www.cnblogs.com/leixinyue/p/11038565.html
- 猫都能看懂的URP RenderFeature使用及自定义方法:https://zhuanlan.zhihu.com/p/396965255
- 猫都能看懂的CommandBuffer在URP中的使用方法:https://zhuanlan.zhihu.com/p/400977346
command buffer插入时机
主要讲了新的urp和builtin有很大不同,导致原有的插入时机基本都不生效了
RenderTexture Test
Test0 : new RenderTexture(cameraDescriptor)
1 | void RTRequestTest0_0(CommandBuffer commandBuffer, ref RenderingData renderingData) |
这个函数是在OnCameraSetup
里面调用的,所以增加了很多判空处理,
为什么不能在Pass生成的时候创建:
渲染纹理的像素内容可能会在某些事件中丢失,比如:加载新关卡,屏幕进入保护模式,全屏进出,当这种情况发生时,你的RenderTexture将再次变成“尚未创建”,遇到这种情况需要用IsCreate函数进行检测。与其他“原生引擎对象”的类型一样,需要关注RenderTexture的生命周期,并在使用完成之后使用Release函数进行释放,因为Render不会像普通托管类型那样被GC。
Test1:RenderTexture.GetTemporary(cameraDescriptor)
1 | void RTRequestTest0_1(CommandBuffer commandBuffer, ref RenderingData renderingData) |
Test2:Shader.PropertyToID
MRT shader: here
pass中:
1 | renderTextureID = Shader.PropertyToID("Request_ID"); |
shader中:
1 | TEXTURE2D(Request_ID); SAMPLER(sampler_Request_ID); |
1 | void RTRequestTest0_2(CommandBuffer commandBuffer, ref RenderingData renderingData) |
Test3:renderTargetHandle
1 | //使用URP的renderTargetHandle获取PropertyToID |
RenderTargetHandle
1 | using UnityEngine.Scripting.APIUpdating; |
[Wrong]Test4:commandBuffer.SetRenderTarget(renderTextureID)
1 | //错误对比用放置于Excute中 |
会导致:skybox绘制到了错误的render target。
问题在于:
有些pass没有自动切回RenderTarget
部分pass缺少configure()重写的函数,比如DrawSkyboxPass
最好是使用ConfigureTarget,除非你自己知道在干嘛。
1 | //in ScriptableRenderPass class |
Draw Mesh Test
介绍了几个绘制网格的api,重点在gpu instancing部分,详见课程和参考链接
command buffer常用函数
非常干,建议结合官方api文档使用,最好是能配合案例
URP下渲染流程和ScriptableRenderFeature以及ScriptableRenderPass的原理
看着源码讲解了几个重要的类
- ScriptableRenderFeature
- ScriptableRenderPass
- ScriptableRenderer
- ForwardRenderer
梳理了urp运行的流程,建议看完catlikecoding文章再来阅读
自定义后处理使用
- VolumeManager的使用
- 材质尽量使用MaterialPropertyBlock避免创建额外实例
command buffer注意事项
作业
结合学过的知识,复刻传送门效果
大体可以拆分为以下:
- 门的出现动画,可以用dotween做,这里直接配合timeline简单k了个动画
- 边框描边,借鉴了shader graph中的Rectangle节点
1 | // 使用mask来插值门颜色和边框颜色 |
- 门背后遮挡物体,这里用的模板测试,优点是实现简单(可以直接用renderfeature),但对视角有要求。本来想用alphatest去做,但考虑到需要修改人物shader,就没继续了。
- 毛玻璃效果,对当前画面(不包括门)抓屏后再用任意模糊算法模糊,重新采样即可。
- 物体与门交互,采样屏幕深度图与门的深度比较即可,参考卡通水那节
课程参考资料
-
Unity官方文档
-
SRP概念相关:
-
LoadAction/StoreAction RendertexuteMemeoryLess
-
Instances:
-
Draw相关指令:
-
Compute Shader:
-
MSAA:
-
RT精度:
补充参考文章
- Hacking into Unity’s rendering pipelines:https://www.youtube.com/watch?v=xrmbtBHJXt8&t=388s
- https://docs.unity.cn/cn/current/Manual/GraphicsCommandBuffers.html
- Using Entity Command Buffers - Unite Copenhagen:https://www.youtube.com/watch?v=SecJibpoTYw&t=34s
- 放牛的星星大佬翻译catlikecoding相关文章:https://zhuanlan.zhihu.com/p/333275514
- 猫都能看懂的URP RenderFeature使用及自定义方法:https://zhuanlan.zhihu.com/p/396965255
- 猫都能看懂的CommandBuffer在URP中的使用方法:https://zhuanlan.zhihu.com/p/400977346
- 大佬笔记: