Unity Built-in Shader转URP Shader 接口查询对照表
本篇文章转自Teofilo Dutra编写的《From Built-in to URP》,其中有很多在写URP管线Shader时需要用到的函数,作为备忘速查表非常实用,所以记录于此。本文经过精简和翻译,不一定适用于大家,可以点击上方链接跳转至作者原文。本文是基于7.3版本的URP编写的,有些暂时还不支持的内容可能在后续版本更新迭代。
结构
首先要在SubShader的Tags中添加”RenderPipeline” = “UniversalPipeline”,并且使用HLSL的宏代替旧版的CG语言宏。
Built-in | URP |
---|---|
CGPROGRAM / HLSLPROGRAM | HLSLPROGRAM |
ENDCG / ENDHLSL | ENDHLSL |
CGINCLUDE / HLSLINCLUDE | HLSLINCLUDE |
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 | 无 |
其他常用的include文件:
- 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
光照模式
Built-in | URP |
---|---|
ForwardBase | UniversalForward |
ForwardAdd | 无 |
Deferred and related | UniversalGBuffer seems to have just been added to URP |
Vertex and related | 无 |
ShadowCaster | ShadowCaster |
MotionVectors | 暂不支持 |
URP其他支持的光照模式:
- DepthOnly
- Meta (用于烘焙光照贴图)
- 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
预定义的着色器预处理宏
辅助宏(Helpers)
Built-in | URP |
---|---|
UNITY_PROJ_COORD(a) | 无,使用 a.xy/a.w 来代替 |
UNITY_INITIALIZE_OUTPUT(type, name) | ZERO_INITIALIZE(type, name) |
阴影贴图
需要包含 Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl
Built-in | URP |
---|---|
UNITY_DECLARE_SHADOWMAP(tex) | TEXTURE2D_SHADOW_PARAM(textureName, samplerName) |
UNITY_SAMPLE_SHADOW(tex, uv) | SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) |
UNITY_SAMPLE_SHADOW_PROJ(tex, uv) | SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord4.xyz/coord4.w) |
纹理/采样器的声明宏
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(name, uv) | SAMPLE_TEXTURE2D(textureName, samplerName, coord2) |
UNITY_SAMPLE_TEX2D_SAMPLER(name, samplername, uv) | SAMPLE_TEXTURE2D(textureName, samplerName, coord2) |
UNITY_SAMPLE_TEX2DARRAY(name, uv) | SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) |
UNITY_SAMPLE_TEX2DARRAY_LOD(name, uv, lod) | SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) |
内置的着色器辅助函数
可以在 Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl 看到下方的所有函数
顶点变换函数
Built-in | URP |
---|---|
float4 UnityObjectToClipPos(float3 pos) | float4 TransformObjectToHClip(float3 positionOS) |
float3 UnityObjectToViewPos(float3 pos) | TransformWorldToView(TransformObjectToWorld(positionOS)) |
泛用的辅助函数
Built-in | URP | Include |
---|---|---|
float3 WorldSpaceViewDir (float4 v) | float3 GetWorldSpaceViewDir(float3 positionWS) | Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl” |
float3 ObjSpaceViewDir (float4 v) | 无,使用 TransformWorldToObject(GetCameraPositionWS()) - objectSpacePosition; | |
float2 ParallaxOffset (half h, half height, half3 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 encodedIlluminance, real4 decodeInstructions) | Include “Packages/com.unity.render-pipelines.core/ShaderLibrary/EntityLighting.hlsl” URP中decodeInstructions 为 half4(LIGHTMAP_HDR_MULTIPLIER, LIGHTMAP_HDR_EXPONENT, 0.0h, 0.0h) |
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 复制 |
前向渲染辅助函数
Built-in | URP | Include |
---|---|---|
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) | include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl” |
屏幕空间辅助函数
Built-in | URP | Include |
---|---|---|
float4 ComputeScreenPos (float4 clipPos) | float4 ComputeScreenPos(float4 positionCS) | Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl” |
float4 ComputeGrabScreenPos (float4 clipPos) | 无 |
顶点光照的辅助函数
Built-in | URP | Include |
---|---|---|
float3 ShadeVertexLights (float4 vertex, float3 normal) | 无,可尝试用 UNITY_LIGHTMODEL_AMBIENT.xyz + VertexLighting(…) | include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl” |
可以在 Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl 中找到一些通用函数
内置的着色器变量
Built-in | URP | Include |
---|---|---|
_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中,额外的灯光存储在一个数组或缓冲中(取决于平台),使用Light GetAdditionalLight(uint i, float3 positionWS)获取光照信息 | Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl” |
unity_4LightAtten0 | URP中,额外的灯光存储在一个数组或缓冲中(取决于平台),使用Light GetAdditionalLight(uint i, float3 positionWS)获取光照信息 | Include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl” |
unity_LightColor | URP中,额外的灯光存储在一个数组或缓冲中(取决于平台),使用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()查询额外的光源数量。
其他方法
阴影
更多阴影相关函数可以查看 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) |
SHADOWS_SCREEN | 暂不支持 |
雾
更多雾相关的函数可以查看 Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl
Built-in | URP |
---|---|
UNITY_FOG_COORDS(x) | 可能没有,可以写作float fogCoord : TEXCOORD0; |
UNITY_TRANSFER_FOG(o, outpos) | o.fogCoord = ComputeFogFactor(clipSpacePosition.z); |
UNITY_APPLY_FOG(coord, col) | color = MixFog(color, i.fogCoord); |
深度
可以包含 “Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl” 并使用 _CameraDepthTexture来调用深度纹理。也可以使用SampleSceneDepth(…) 和 LoadSceneDepth(…)。
Built-in | URP | Include |
---|---|---|
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” |
其他
Built-in | URP | Include |
---|---|---|
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” |
后期/特效
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
void OnEnable() {RenderPipelineManager.beginCameraRendering += MyCameraRendering; }void OnDisable() {RenderPipelineManager.beginCameraRendering -= MyCameraRendering; }void MyCameraRendering(ScriptableRenderContext context, Camera camera) {...if(camera == myEffectCamera){...UniversalRenderPipeline.RenderSingleCamera(context, camera);}... } |
另外,可以创建ScriptableRendererFeature来实现后期处理效果。可以在管线的不同阶段注入ScriptableRenderPasses:
- BeforeRendering
- BeforeRenderingShadows
- AfterRenderingShadows
- BeforeRenderingPrepasses
- AfterRenderingPrePasses
- BeforeRenderingOpaques
- AfterRenderingOpaques
- BeforeRenderingSkybox
- AfterRenderingSkybox
- BeforeRenderingTransparents
- AfterRenderingTransparents
- BeforeRenderingPostProcessing
- AfterRenderingPostProcessing
- AfterRendering
下面是一个示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
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);} } |
Unity Built-in Shader转URP Shader 接口查询对照表相关推荐
- Unity URP shader 出现 SRP Batcher 为 not compatible时 渲染性能会下降 应该怎么处理 ?
以下是Unity官网对SPR Batcher 加速渲染的介绍 https://blog.unity.com/technology/srp-batcher-speed-up-your-rendering ...
- unity 线程断点时卡机_Compute Shader在Unity和UE4中的应用
该文档为学习文档,如有错误欢迎指正. 1. D3D11 Compute Shader概述 Compute Shader 是一个通用计算 Stage.它利用了GPU的并行处理器,实现大量线程并发执行.它 ...
- URP shader 学习笔记
自学shader中,shader的api不好找啊.自己整理整理 万一以后有用呢~(未完待续) 目录 写在前面 ShaderGraph节点库 小技巧 小技巧001 Shader结构 Properties ...
- URP Shader FrameBuffer Fetch Mali Crash
1)URP Shader FrameBuffer Fetch Mali Crash 2)Unity模型Lightmap UV相关的疑问 3)动画上下半身融合问题 4)AnimatorControll ...
- Unity基础三: 什么是Shader
什么是Shader Shader(着色器)是一段能够针对3D对象进行操作.并被GPU所执行的程序.Shader并不是一个统一的标准,不同的图形接口的Shader并不相同.OpenGL的着色语言是GLS ...
- Unity从零开始实现一个全息效果Shader
Unity从零开始实现一个全息效果Shader 前言 开始捣鼓 一.准备阶段 二.先从透明效果开始 三.顶点故障效果 四.扫描线效果 五.菲尼尔反射效果 六.颗粒效果 七.颜色故障效果 CustomE ...
- Unity Shader variants (shader 变体)
官方地址 https://docs.unity3d.com/cn/2022.2/Manual/SL-MultipleProgramVariants.html 教程可以看这里 https://www.j ...
- 案例学习——Unity基于体绘制的大气散射shader
本案例学习资料来源 Volumetric Atmospheric Scattering 案例学习--Unity基于体绘制的大气散射shader 0 效果展示 1 引入 1.0 介绍 1.1 单次散射( ...
- Unity Shader - Making multiple shader program variants 制作shader程序多变体
目录:Unity Shader - 知识点目录(先占位,后续持续更新) 原文:Making multiple shader program variants 版本:2019.1 Making mult ...
最新文章
- 以上帝模式管理Windows系统
- 什么是控制单元?—Vecloud微云
- 6大最流行、最有用的自然语言处理库对比
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysq
- css input光标粗细,如何用CSS原生属性caret-color改变input输入框光标颜色
- linux网络相关配置
- 给爸妈最硬核的春节礼物,走入百度大字版APP研发幕后
- android定时切换活动,安卓手机如何定时自动切换情景模式 (全文)
- 【Java 进阶】匿名类(代码传递、回调、过滤器)、Lambda表达式(方法引用)、函数式接口(Supplier、Consumer、Predicate、Function)
- 自学编程,上这8个免费网站,省去上万元学费
- 详解minigui图片加载及显示
- cmake使用boost库
- php 如何创建一个对象,创建一个PHP对象 - BENNEE的个人空间 - OSCHINA - 中文开源技术交流社区...
- JavaScript高级程序设计(红宝石书)学习笔记
- Tanzu学习系列之TKGm 1.4 for vSphere 组件集成(二)
- 没日没夜做需求,就能交出满分答卷吗?
- YFX云分享软件库驾培不可或缺的教学工具。
- git pull 时出现:There is no tracking information for the current branch. Please specify which branch...
- linux无法显示输入法图标,linux mint12安装ibus之后,语言栏不跟随光标和系统托盘输入法图标不能显示问题解决...
- Overlapping Experiment Infrastructure: More, Better, Faster Experimentation
热门文章
- linux脚本登录启动失败,linux-从bash脚本启动进程失败
- html中加法,javascript 实现加法运算详解
- centos6 进入命令行_CentOS 6.x误删libc.so.6,紧急恢复
- 软件包管理器(树链剖分)
- little w and Segment Coverage(差分)
- disconf mysql_disconf-web 安装
- PAT_甲级_1002_C语言
- 【超分辨率实验】基于高斯模糊的训练数据集构建方法改进(matlab)
- 轻量级3d模型查看器_你该试试这样来管理你的3D资产了 Connecter
- PyTorch1.0 教程 例子和书籍