unity unity改变kinect深度颜色_Unity 重Built-in到URP函数对应整理

cd5445137483b6e866ecb271880045f6.png

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 编写

05b8c5400215885d8925debe3146c7b1.png

Shader Include 头文件

c5a98a283dd674ee75810e6a76366cdc.png

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.hlsl
  • Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl
  • Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl
  • Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl
  • Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl
  • Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl
  • Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTextue.hlsl

灯光模式

a790552bf4c01ab383951d6bb3568502.png
UniversalGBuffer 刚被添加URP​github.com

支持的其他照明模式包括

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

辅助函数

5206ef8304b9b6d32549863afcc0e88c.png

阴影贴图

你必须包含 #include"Packages/com.unity.renderpipelines.universal/ShaderLibrary/Shadows.hlsl"

ae4a6599c3b4584fedc42497a179344d.png

贴图/采样器 声明宏

Unity 有很多纹理/采样器 用来兼容不同平台 ,这些仍然在URP 中,但现在有了不同的名称和

新增,由于数量很多这里不会全部列出,你可以针对不同API平台查看他们的具体定义 API includes.

a5b89116bb26f3568cc8b4e7d404a7c4.png

需要注意的一点是 SCREENSPACE_TEXTURE 已经变为 TEXTURE2D_X ,如果你正在做一些VR (单通道/立体渲染)下的屏幕空间的特效

你必须用TEXTURE2D_X 声明 ,此宏将正确的处理纹理(是否为数组),还必须使用 SAMPLE_TEXTURE2D_X 采样贴图,UV 使用

UnityStereoTransformScreenSpaceTex

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

顶点变换函数

c04111183df8248cf6bc9ee0f3d6370d.png

通用辅助函数

fbba981b5f4c3f9043c96d75537200ef.png

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”

前向渲染辅助函数

e340d6d9084373ca23ddb0e66d1c8651.png

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”

屏幕空间辅助函数

9b65974e4ac80554f3922056ab06a380.png

Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl”

顶点光照辅助函数

bef9d92243a54781fa15cb7982e746b0.png

For VertexLighting(...) include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl”

公用的函数可以在这里找到

“Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl”.

内置shader 变体
除了灯光 大多数的shader 变量保持不变

灯光

181c02f605993a2008e793e235b5dd86.png

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”.

7b001ae909352c598fb3c3f5a022a95a.png

雾Fog

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

深度Depth

要使用相机深度请包含 “Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl”

你还需要声明 _CameraDepthTexture 及帮助函数 SampleSceneDepth(...) 和LoadSceneDepth(...).

5442dcc23b0d6d9530c81b7b9f6535ec.png

Include “Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl”

Include “Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl”

其他

a2aa7f60d5fdd170b565e29fd4d7da7a.png

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)

用法示例

void OnEnable()
{
	RenderPipelineManager.beginCameraRendering += MyCameraRendering;
}
void OnDisable()
{
	RenderPipelineManager.beginCameraRendering -= MyCameraRendering;
}
void MyCameraRendering(ScriptableRenderContext context, Camera camera)
{
	...
	if(camera == myEffectCamera)
	{
	...
	}
	...
}

虽然支持OnWillRenderObject,但是,如果您需要在其中执行渲染调用(例如,水反射/折射),它就无法正常工作。
在这种情况下,用begin / endCameraRendering(如上面的示例)替换OnWillRenderObject,然后从URP而不是Camera.Render()中调用RenderSingleCamera()。更改上面的示例

void MyCameraRendering(ScriptableRenderContext context, Camera camera)
{
	...
	if(camera == myEffectCamera)
	{
	...
		UniversalRenderPipeline.RenderSingleCamera(context, camera);
	}
	...
}

使用后处理的另一种方法是使用ScriptableRendererFeature。这篇文章很好地解释了使用此功能的描边效果。

A ScriptableRendererFeature允许您ScriptableRenderPass(es)在管道的不同阶段进行注入,

BeforeRendering

BeforeRenderingShadows

AfterRenderingShadows

BeforeRenderingPrepasses

AfterRenderingPrePasses

BeforeRenderingOpaques

AfterRenderingOpaques

BeforeRenderingSkybox

AfterRenderingSkybox

BeforeRenderingTransparents

AfterRenderingTransparents

BeforeRenderingPostProcessing

AfterRenderingPostProcessing

AfterRendering

这是使用 ScriptableRendererFeature 自定义材质执行blit 的简单示例:

public class CustomRenderPassFeature : ScriptableRendererFeature
{
    class CustomRenderPass : ScriptableRenderPass
    {
        CustomRPSettings _CustomRPSettings;
        RenderTargetHandle _TemporaryColorTexture;
        private RenderTargetIdentifier _Source;
        private RenderTargetHandle _Destination;
        public CustomRenderPass(CustomRPSettings settings)
        {
            _CustomRPSettings = settings;
        }
        public void Setup(RenderTargetIdentifier source, RenderTargetHandle destination)
        {
            _Source = source;
            _Destination = destination;
        }
        public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
        {
            _TemporaryColorTexture.Init("_TemporaryColorTexture");
        }
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            CommandBuffer cmd = CommandBufferPool.Get("My Pass");
            if (_Destination == RenderTargetHandle.CameraTarget)
            {
             cmd.GetTemporaryRT(_TemporaryColorTexture.id, renderingData.cameraData.cameraTargetDescriptor, FilterMode.Point);
                cmd.Blit(_Source, _TemporaryColorTexture.Identifier());
                cmd.Blit(_TemporaryColorTexture.Identifier(), _Source, _CustomRPSettings.m_Material);
            }
            else
            {
                cmd.Blit(_Source, _Destination.Identifier(), _CustomRPSettings.m_Material, 0);
            }
           context.ExecuteCommandBuffer(cmd);
            CommandBufferPool.Release(cmd);
        }
        public override void FrameCleanup(CommandBuffer cmd)
        {
            if (_Destination == RenderTargetHandle.CameraTarget)
            {
                cmd.ReleaseTemporaryRT(_TemporaryColorTexture.id);
            }
        }
    }
    [System.Serializable]
    public class CustomRPSettings
    {
        public Material m_Material;
    }
    public CustomRPSettings m_CustomRPSettings = new CustomRPSettings();
    CustomRenderPass _ScriptablePass;
    public override void Create()
    {
        _ScriptablePass = new CustomRenderPass(m_CustomRPSettings);
        _ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
    }
    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
    {
        _ScriptablePass.Setup(renderer.cameraColorTarget, RenderTargetHandle.CameraTarget);
        renderer.EnqueuePass(_ScriptablePass);
    }
}

点击 “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-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值