目录

1.总体结构

2.Shader Include 头文件

3.灯光模式

4.变种Variants

5.预处理宏 Predefined Shader Preprocessor Macros

5.1辅助函数

5.2阴影贴图

5.3贴图/采样器 声明宏

6.内置的shader 辅助函数

6.1顶点变换函数

6.2通用辅助函数

6.3前向渲染辅助函数

6.4屏幕空间辅助函数

6.5顶点光照辅助函数

7.内置shader 变体

7.1灯光

8.杂项

8.1shadow

8.2雾Fog

8.3深度Depth

8.4其他

9.后处理/VFX (视觉特效)


这里的大部分内容基于 7.3 版 ,有可能新版本会发生变化,请留意最新文档!

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

1.总体结构

首先添加 "RenderPipeline" = "UniversalPipeline" 到Tag 下一步 所有的URP shader 都是使用HLSLPROGRAM/ENDHLSL/etc. 包含的HLSL 编写

Built-in

URP

CGPROGRAM
HLSLPROGRAM

HLSLPROGRAM

ENDCG
ENDHLSL

ENDHLSL

CGINCLUDE
HLSLINCLUDE

HLSLINCLUDE

2.Shader Include 头文件

Content

Built-in

URP

Core

Unity.cginc

Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl

Light

AutoLight.cginc

Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl

Shadows

AutoLight.cginc

Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl

Surface shaders

Lighting.cginc

没有 ,但这个链接可以找到一个辅助项目 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

3.灯光模式

Built-in

URP

ForwardBase

UniversalForward

ForwardAdd

Deferred and related

UniversalGBuffer 刚被添加URP

Vertex and related

ShadowCaster

ShadowCaster

MotionVectors

暂不支持

支持的其他照明模式包括

1.DepthOnly

2. Meta (用于烘焙光照贴图)

3.Universal2D

4.变种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

5.预处理宏 Predefined Shader Preprocessor Macros

5.1辅助函数

Built-in

URP

UNITY_PROJ_COORD(a)

Gone. Do a.xy/a.w instead

UNITY_INITIALIZE_OUTPUT(typename)

ZERO_INITIALIZE(typename)

5.2阴影贴图

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

Built-in

URP

UNITY_DECLARE_SHADOWMAP(tex)

TEXTURE2D_SHADOW_PARAM(textureNamesamplerName)

UNITY_SAMPLE_SHADOW(texuv)

SAMPLE_TEXTURE2D_SHADOW(textureNamesamplerNamecoord3)

UNITY_SAMPLE_SHADOW_PROJ(texuv)

SAMPLE_TEXTURE2D_SHADOW(textureNamesamplerNamecoord4.xyz/coord4.w)

5.3贴图/采样器 声明宏

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

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

Built-in

URP

UNITY_DECLARE_TEX2D(name)

TEXTURE2D(textureName); SAMPLER(samplerName);

UNITY_DECLARE_TEX2D_NOSAMPLER(name)

TEXTURE2D(textureName);

UNITY_DECLARE_TEX2DARRAY(name)

TEXTURE2D_ARRAY(textureName); SAMPLER(samplerName);

UNITY_SAMPLE_TEX2D(nameuv)

SAMPLE_TEXTURE2D(textureNamesamplerNamecoord2)

UNITY_SAMPLE_TEX2D_SAMPLER(namesamplernameuv)

SAMPLE_TEXTURE2D(textureNamesamplerNamecoord2)

UNITY_SAMPLE_TEX2DARRAY(nameuv)

SAMPLE_TEXTURE2D_ARRAY(textureNamesamplerNamecoord2index)

UNITY_SAMPLE_TEX2DARRAY_LOD(nameuvlod)

SAMPLE_TEXTURE2D_ARRAY_LOD(textureNamesamplerNamecoord2indexlod)

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

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

UnityStereoTransformScreenSpaceTex

6.内置的shader 辅助函数

你需要包含

#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"

6.1顶点变换函数

Built-in

URP

float4 UnityObjectToClipPos(float3 pos)

float4 TransformObjectToHClip(float3 positionOS)

float3 UnityObjectToViewPos(float3 pos)

TransformWorldToView(TransformObjectToWorld(positionOS))

6.2通用辅助函数

Built-in

URP

 

float3 WorldSpaceViewDir (float4 v)

float3 GetWorldSpaceViewDir(float3 positionWS)

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

float3 ObjSpaceViewDir (float4 v)

Gone. Do TransformWorldToObject(GetCameraPositionWS()) - objectSpacePosition;

float2 ParallaxOffset (half hhalf heighthalf3 viewDir)

无? 重 UnityCG.cginc拷贝

fixed Luminance (fixed3 c)

real Luminance(real3 linearRgb)

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

fixed3 DecodeLightmap (fixed4 color)

real3 DecodeLightmap(real4 encodedIlluminancereal4 decodeInstructions)

Include “Packages/com.unity.render-pipelines.core/ShaderLibrary/EntityLighting.hlsl”
decodeInstructions is used as half4(LIGHTMAP_HDR_MULTIPLIER, LIGHTMAP_HDR_EXPONENT, 0.0h, 0.0h) by URP

float4 EncodeFloatRGBA (float v)

无? 重 UnityCG.cginc 拷贝

float DecodeFloatRGBA (float4 enc)

无? 重 UnityCG.cginc 拷贝

float2 EncodeFloatRG (float v)

无? 重 UnityCG.cginc 拷贝

float DecodeFloatRG (float2 enc)

无? 重 UnityCG.cginc 拷贝

float2 EncodeViewNormalStereo (float3 n)

无? 重 UnityCG.cginc 拷贝

float3 DecodeViewNormalStereo (float4 enc4)

无? 重 UnityCG.cginc 拷贝

6.3前向渲染辅助函数

Built-in

URP

float3 WorldSpaceLightDir (float4 v)

_MainLightPosition.xyz - TransformObjectToWorld(objectSpacePosition)

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

float3 ObjSpaceLightDir (float4 v)

TransformWorldToObject(_MainLightPosition.xyz) - objectSpacePosition

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

float3 Shade4PointLights ()

无. 你可以尝试这个 half3 VertexLighting(float3 positionWS, half3 normalWS)

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

6.4屏幕空间辅助函数

Built-in

URP

 

float4 ComputeScreenPos (float4 clipPos)

float4 ComputeScreenPos(float4 positionCS)

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

float4 ComputeGrabScreenPos (float4 clipPos)

无.

6.5顶点光照辅助函数

Built-in

URP

 

float3 ShadeVertexLights (float4 vertexfloat3 normal)

无.你可以尝试这个  UNITY_LIGHTMODEL_AMBIENT.xyz + VertexLighting(...)

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

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

7.内置shader 变体

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

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

7.1灯光

Built-in

URP

 

_LightColor0

_MainLightColor

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

_WorldSpaceLightPos0

_MainLightPosition

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

_LightMatrix0

无? 尚未支持烘焙

unity_4LightPosX0,

unity_4LightPosY0,

unity_4LightPosZ0

在URP 中,其他的光源储存在数组 Array/缓冲区Buffer 中(取决于平台).      检索灯光信息  
Light GetAdditionalLight(uint i, float3 positionWS)

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

unity_4LightAtten0

在URP 中,其他的光源储存在数组 Array/缓冲区Buffer 中(取决于平台).      检索灯光信息 
Light GetAdditionalLight(uint i, float3 positionWS)

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

unity_LightColor

在URP 中,其他的光源储存在数组 Array/缓冲区Buffer 中(取决于平台).      检索灯光信息 
Light GetAdditionalLight(uint i, float3 positionWS)

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

unity_WorldToShadow

float4x4 _MainLightWorldToShadow[MAX_SHADOW_CASCADES + 1] or _AdditionalLightsWorldToShadow[MAX_VISIBLE_LIGHTS]

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

如果你要使用  GetAdditionalLight(...) 遍历灯光 ,你可以使用它来查询其他灯光数量 GetAdditionalLightsCount()

8.杂项
8.1shadow

有关阴影的更多信息请查看

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

Built-in

URP

 

UNITY_SHADOW_COORDS(x)

无? 自定义一个. float4 shadowCoord : TEXCOORD0;

TRANSFER_SHADOW(a)

a.shadowCoord = TransformWorldToShadowCoord(worldSpacePosition)

当启用级联时(CSM ) 在片段着色器应用防止伪影

SHADOWS_SCREEN

无. 不支持.

8.2雾Fog

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

8.3深度Depth

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

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

Built-in

URP

 

LinearEyeDepth(sceneZ)

LinearEyeDepth(sceneZ_ZBufferParams)

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

Linear01Depth(sceneZ)

Linear01Depth(sceneZ_ZBufferParams)

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

8.4其他

Built-in

URP

 

ShadeSH9(normal)

SampleSH(normal)

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

unity_ColorSpaceLuminance

无. 请使用 Luminance()

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

9.后处理/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 并选择你要添加的功能,

例如如果你使用了上面的示例代码 ,可以看到一个可用的材质槽

Unity内置Built-in到可编程URP函数对应整理相关推荐

  1. Unity内置的三套消息发送机制的应用实例

    转自http://blog.sina.com.cn/s/blog_1491e52310102wuf6.html 代码简介 : [1] 实例中包含2个类文件, SendMessage.cs 和 Rece ...

  2. Unity 内置着色器下载方法

    Unity 内置着色器下载方法 官方下载 GitHub下载 官方下载 需要科学上网 官方下载链接 https://unity3d.com/get-unity/download/archive GitH ...

  3. Unity内置资源如何打包避免冗余

    这是第249篇UWA技术知识分享的推送.今天我们继续为大家精选了若干和开发.优化相关的问题,建议阅读时间10分钟,认真读完必有收获. UWA 问答社区:answer.uwa4d.com UWA QQ群 ...

  4. Unity内置管线升级URP之色彩空间(伽马、sRGB、Gamma Space和Linear Space)

    目录 本文内容 伽马(Gamma) sRGB 色彩空间(Color Space) 总结 转色彩空间后出现问题的缘由 1.相同场景材质和光照为什么变暗了? 2.个人定制化的PBR显示不正确了?(讨论的是 ...

  5. 闲云野鹤:吃鸡(四)之场景制作—用unity内置草功能制作草

    先上最终效果图吧: 第一种方式:Add Grass Texture,只需要选择草的图片即可 选择Add Grass Texture此种方式unity默认mesh为一个矩形面.基本制作过程没什么值得多说 ...

  6. Unity内置Shader解读3——Decal

    1.Shader在什么情况下使用 Decal(贴花)贴花就是类似于CF里的喷漆,或者汽车/墙上等贴一个贴纸. image.png 2.Shader的价值(用的多不多),Shader的难度 这个应该是极 ...

  7. Unity 内置访问安卓权限

    这两天在整游戏内的一些有关安卓的一些功能,本来打算从安卓那边拉起的,但是unity调用java,又调用C++,这样调来调去增加了不少压力,于是我就发现,原来Unity自己有一个内置的MainActiv ...

  8. Unity 内置管线Shader升级到URP详细手册

    本文转载自:https://www.jianshu.com/p/3fef69e2efb6 作为技术资料记录和备份,避免遗忘或删除 //================以下为具体内容========== ...

  9. 【工具篇】Unity内置渲染管线和URP以及HDRP轮廓外发光边缘光高亮显示演示

    目录 一.内置渲染管线(Built_IN) 一. 效果展示 二.使用教学 Quick Outline 二.URP渲染管线

最新文章

  1. The Beam Model:Stream Tables翻译(上)
  2. OCT检查报告-光感受器COST线缺失与黄斑前膜
  3. 主进程退出后子进程还会存在吗?_【干货】Linux进程模型 全解
  4. 小贷公司的风险成因及应对策略——策略篇
  5. vs.net 2005中引用webservice的简单方法
  6. 第八节:SpringBoot指定配置文件配置三
  7. ubuntu 16源码安装zabbix4.2
  8. Python for循环中使用index索引
  9. 30个要点帮你完成java代码优化
  10. 【NIPS 2017】基于深度强化学习的想象力增强智能体
  11. 图解:如何在LINUX中安装VM-Tools
  12. 用nginx-rrd监控nginx访问数
  13. Excel,遗忘密码后如何撤销工作表保护密码
  14. 代码审计之企业级进销存管理系统
  15. Drain算法:日志解析
  16. 学习!嵌入式底层驱动工程师学习方法
  17. unity5.6.5适配Android P刘海屏,两侧去黑边
  18. js 递归函数(函数自己调用自己)
  19. Codeforces Round #252 (Div. 2)-C,D
  20. SSD的王者 PCIe固态硬盘的未来在哪里

热门文章

  1. mysql查询前20条数据_SQL查询排序后前20条语句
  2. 掌握这3点你也可以,我每天涨粉300个,做自媒体如何快速吸粉?
  3. 使用js动态控制html页面缩放
  4. OPPO/Realme手机Q2pro X7 Pro 出现download not completed 下载未完成 0X99256658 救砖格机修复
  5. E20-021 考试培训
  6. 名人成长的烦恼的故事有哪些?
  7. matlab中用转义符来输入希腊字母的方法
  8. mysql主键generated_MySQL之虚拟列(generated-columns)
  9. 常用类-String类
  10. X METAVERSE PRO creates a truly immersive metaverse virtual platform