找回密码
 立即注册
查看: 563|回复: 0

Unity 重Built-in到URP函数对应整理

[复制链接]
发表于 2021-1-5 09:44 | 显示全部楼层 |阅读模式
Unity 的可编程渲染管线(Scriptable Render Pipeline) 代表了Unity处理图形方式的一大进步,为用户提供了更多定制管线的能力,我已经开始使用通用管线 (Universal Render Pipeline) 但仍然缺文档,你可以找到包含每个可用函数的信息,但仍然难找到 重Built-in 到 URP 的示例。
本文提供重 Built-in 到 URP 的示例总结,希望可以帮助到大家
1.开始之前这里有一些链接可以帮助你深入了解URP
Unity URP 官方文档
UnityURP Github
官方示例工程
Unlit template
Boat attack demo project
Phil Lira’s shader examples
Outline post-effect using ScriptableRendererFeature
目录
这里的大部分内容基于 7.3 版 ,有可能新版本会发生变化,请留意最新文档!
1.总体结构
2.Shader Include 头文件
3.灯光模式 Light Modes
4.变体 Variants
5.预处理宏 Predefined Shader Preprocessor Macros
             5.1.辅助宏
             5.2.阴影贴图 shadow Mapping
             5.3.贴图/采样器 声明宏
6.内置的shader 辅助函数
             6.1.顶点变换函数
             6.2.通用辅助函数
             6.3.前向渲染辅助函数
             6.4.屏幕空间辅助函数
7.内置shader 变体
             7.1.灯光
8.杂项   
             8.1.阴影
             8.2.雾
             8.3.深度
             8.4.其他
9.后处理/VFX (视觉特效)


总体结构
首先添加 "RenderPipeline" = "UniversalPipeline" 到Tag 下一步 所有的URP shader 都是使用HLSLPROGRAM/ENDHLSL/etc. 包含的HLSL 编写
Shader Include 头文件
Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl
Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl
Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl
这个链接可以找到一个辅助项目 here


其他有用的包括
    Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlslPackages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlslPackages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlslPackages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlslPackages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlslPackages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlslPackages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTextue.hlsl


灯光模式
支持的其他照明模式包括
    1.DepthOnly
    2. Meta (用于烘焙光照贴图)
    3.Universal2D


变种Variants
URP 支持变体 ,你可能需要某些功能  #pragma multi_compile  添加以下关键字
_MAIN_LIGHT_SHADOWS
_MAIN_LIGHT_SHADOWS_CASCADE
_ADDITIONAL_LIGHTS_VERTEX
_ADDITIONAL_LIGHTS
_ADDITIONAL_LIGHT_SHADOWS
_SHADOWS_SOFT
_MIXED_LIGHTING_SUBTRACTIVE


预处理宏 Predefined Shader Preprocessor Macros
辅助函数
阴影贴图
你必须包含 #include"Packages/com.unity.renderpipelines.universal/ShaderLibrary/Shadows.hlsl"


贴图/采样器 声明宏
Unity 有很多纹理/采样器 用来兼容不同平台 ,这些仍然在URP 中,但现在有了不同的名称和
新增,由于数量很多这里不会全部列出,你可以针对不同API平台查看他们的具体定义 API includes.
需要注意的一点是 SCREENSPACE_TEXTURE 已经变为 TEXTURE2D_X ,如果你正在做一些VR (单通道/立体渲染)下的屏幕空间的特效
你必须用TEXTURE2D_X 声明 ,此宏将正确的处理纹理(是否为数组),还必须使用 SAMPLE_TEXTURE2D_X 采样贴图,UV 使用
UnityStereoTransformScreenSpaceTex


内置的shader 辅助函数
你需要包含 #include#34;Packages/com.unity.renderpipelines.core/ShaderLibrary/SpaceTransforms.hlsl"

顶点变换函数


通用辅助函数
Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl”
Include “Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl”
Include “Packages/com.unity.renderpipelines.core/ShaderLibrary/EntityLighting.hlsl”


前向渲染辅助函数
Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl”
Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl”
For VertexLighting(...) include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl”


屏幕空间辅助函数
Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl”




顶点光照辅助函数
For VertexLighting(...) include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl”


公用的函数可以在这里找到
“Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl”.

内置shader 变体
除了灯光 大多数的shader 变量保持不变
灯光
Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl”
Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl”
Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl”
Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl”
如果你要使用  GetAdditionalLight(...) 遍历灯光 ,你可以使用它来查询其他灯光数量 GetAdditionalLightsCount()


杂项
shadow
有关阴影的更多信息请查看
“Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl”.



雾Fog
更多雾相关的请查看此文件  “Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl”.


深度Depth
要使用相机深度请包含  “Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl”
你还需要声明 _CameraDepthTexture 及帮助函数  SampleSceneDepth(...) 和LoadSceneDepth(...).
Include “Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl”
Include “Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl”


其他
Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl”
Include “Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl”


后处理/VFX (视觉特效)
URP不支持OnPreCull,OnPreRender,OnPostRender和OnRenderImage,
它确实支持OnRenderObject和OnWillRenderObject,但是您可能会发现问题,具体取决于你想做什么

RenderPipelineManager 提供以下注入点
beginCameraRendering(ScriptableRenderContext context, Camera camera)
endCameraRendering(ScriptableRenderContext context, Camera camera)
beginFrameRendering(ScriptableRenderContext context,Camera[] cameras)
endFrameRendering(ScriptableRenderContext context,Camera[] cameras)
用法示例
  1. void OnEnable()
  2. {
  3.         RenderPipelineManager.beginCameraRendering += MyCameraRendering;
  4. }
  5. void OnDisable()
  6. {
  7.         RenderPipelineManager.beginCameraRendering -= MyCameraRendering;
  8. }
  9. void MyCameraRendering(ScriptableRenderContext context, Camera camera)
  10. {
  11.         ...
  12.         if(camera == myEffectCamera)
  13.         {
  14.         ...
  15.         }
  16.         ...
  17. }
复制代码
虽然支持OnWillRenderObject,但是,如果您需要在其中执行渲染调用(例如,水反射/折射),它就无法正常工作。
在这种情况下,用begin / endCameraRendering(如上面的示例)替换OnWillRenderObject,然后从URP而不是Camera.Render()中调用RenderSingleCamera()。更改上面的示例
  1. void MyCameraRendering(ScriptableRenderContext context, Camera camera)
  2. {
  3.         ...
  4.         if(camera == myEffectCamera)
  5.         {
  6.         ...
  7.                 UniversalRenderPipeline.RenderSingleCamera(context, camera);
  8.         }
  9.         ...
  10. }
复制代码

使用后处理的另一种方法是使用ScriptableRendererFeature。这篇文章很好地解释了使用此功能的描边效果。
A ScriptableRendererFeature允许您ScriptableRenderPass(es)在管道的不同阶段进行注入,
BeforeRendering
BeforeRenderingShadows
AfterRenderingShadows
BeforeRenderingPrepasses
AfterRenderingPrePasses
BeforeRenderingOpaques
AfterRenderingOpaques
BeforeRenderingSkybox
AfterRenderingSkybox
BeforeRenderingTransparents
AfterRenderingTransparents
BeforeRenderingPostProcessing
AfterRenderingPostProcessing
AfterRendering
这是使用 ScriptableRendererFeature 自定义材质执行blit 的简单示例:
  1. public class CustomRenderPassFeature : ScriptableRendererFeature
  2. {
  3.     class CustomRenderPass : ScriptableRenderPass
  4.     {
  5.         CustomRPSettings _CustomRPSettings;
  6.         RenderTargetHandle _TemporaryColorTexture;
  7.         private RenderTargetIdentifier _Source;
  8.         private RenderTargetHandle _Destination;
  9.         public CustomRenderPass(CustomRPSettings settings)
  10.         {
  11.             _CustomRPSettings = settings;
  12.         }
  13.         public void Setup(RenderTargetIdentifier source, RenderTargetHandle destination)
  14.         {
  15.             _Source = source;
  16.             _Destination = destination;
  17.         }
  18.         public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
  19.         {
  20.             _TemporaryColorTexture.Init("_TemporaryColorTexture");
  21.         }
  22.         public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  23.         {
  24.             CommandBuffer cmd = CommandBufferPool.Get("My Pass");
  25.             if (_Destination == RenderTargetHandle.CameraTarget)
  26.             {
  27.              cmd.GetTemporaryRT(_TemporaryColorTexture.id, renderingData.cameraData.cameraTargetDescriptor, FilterMode.Point);
  28.                 cmd.Blit(_Source, _TemporaryColorTexture.Identifier());
  29.                 cmd.Blit(_TemporaryColorTexture.Identifier(), _Source, _CustomRPSettings.m_Material);
  30.             }
  31.             else
  32.             {
  33.                 cmd.Blit(_Source, _Destination.Identifier(), _CustomRPSettings.m_Material, 0);
  34.             }
  35.            context.ExecuteCommandBuffer(cmd);
  36.             CommandBufferPool.Release(cmd);
  37.         }
  38.         public override void FrameCleanup(CommandBuffer cmd)
  39.         {
  40.             if (_Destination == RenderTargetHandle.CameraTarget)
  41.             {
  42.                 cmd.ReleaseTemporaryRT(_TemporaryColorTexture.id);
  43.             }
  44.         }
  45.     }
  46.     [System.Serializable]
  47.     public class CustomRPSettings
  48.     {
  49.         public Material m_Material;
  50.     }
  51.     public CustomRPSettings m_CustomRPSettings = new CustomRPSettings();
  52.     CustomRenderPass _ScriptablePass;
  53.     public override void Create()
  54.     {
  55.         _ScriptablePass = new CustomRenderPass(m_CustomRPSettings);
  56.         _ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
  57.     }
  58.     public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
  59.     {
  60.         _ScriptablePass.Setup(renderer.cameraColorTarget, RenderTargetHandle.CameraTarget);
  61.         renderer.EnqueuePass(_ScriptablePass);
  62.     }
  63. }
复制代码

点击  “Create > Rendering > Universal Render Pipeline > Renderer Feature”.  你可以创建一个 ScriptableRendererFeature  
你创建的功能必须添加到 ForwardRenderer,选择 ForwardRenderer 点击 Add Renderer Feature 并选择你要添加的功能,例如如果你使用了上面的示例代码 ,可以看到一个可用的材质槽


知乎的编辑器真是辣鸡,文章是为知编辑导出Word 竟然丢表格.所以都截图了,
中文版下载  https://pan.baidu.com/s/1zdWSHvF6JNw7YPoszfm7RQ 提取码: vsss
原文链接: https://teofilobd.github.io/unity/shaders/urp/graphics/2020/05/18/From-Built-in-to-URP.html#helpers-

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-23 17:24 , Processed in 0.089892 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表