| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> Unity 重内置 Built-in 到 可编程 URP 函数对应整理 -> 正文阅读 |
|
[游戏开发]Unity 重内置 Built-in 到 可编程 URP 函数对应整理 |
目录 5.预处理宏 Predefined Shader Preprocessor Macros ? ? ? ? ?8.1shadow? 这里的大部分内容基于 7.3 版 ,有可能新版本会发生变化,请留意最新文档! Unity 的 可编程渲染管线(Scriptable Render Pipeline) 代表了Unity处理图形方式的一大进步,为用户提供了更多定制管线的能力,我已经开始使用通用管线 (Universal Render Pipeline) 但仍然缺文档,你可以找到包含每个可用函数的信息,但仍然难找到 重Built-in 到 URP 的示例。 本文提供重 Built-in 到 URP 的示例总结,希望可以帮助到大家 1.开始之前这里有一些链接可以帮助你深入了解URP Outline post-effect using ScriptableRendererFeature 1.总体结构首先添加 "RenderPipeline" = "UniversalPipeline" 到Tag 下一步 所有的URP shader 都是使用HLSLPROGRAM/ENDHLSL/etc. 包含的HLSL 编写
2.Shader Include 头文件
其他有用的包括
3.灯光模式
支持的其他照明模式包括 ? ? 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 Macros5.1辅助函数
5.2阴影贴图你必须包含?#include?"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl"
5.3贴图/采样器 声明宏Unity 有很多纹理/采样器 用来兼容不同平台 ,这些仍然处理URP 中,但现在有了不同的名称和 新添加的,由于数量很多这里不会全部列出,你可以针对不同API平台查看他们的具体定义?API includes.
需要注意的一点是 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顶点变换函数
6.2通用辅助函数
6.3前向渲染辅助函数
6.4屏幕空间辅助函数
6.5顶点光照辅助函数
公用的函数可以在这里找到? 7.内置shader 变体“Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl”. 除了灯光 大多数的shader 变量保持不变 7.1灯光
如果你要使用 ?GetAdditionalLight(...) 遍历灯光 ,你可以使用它来查询其他灯光数量 GetAdditionalLightsCount() 8.杂项
|
Built-in | URP | ? |
UNITY_SHADOW_COORDS(x) | 无? 自定义一个.?float4 shadowCoord : TEXCOORD0; | |
TRANSFER_SHADOW(a) | a.shadowCoord?=?TransformWorldToShadowCoord(worldSpacePosition) | 当启用级联时(CSM ) 在片段着色器应用防止伪影 |
SHADOWS_SCREEN | 无. 不支持. |
更多雾相关的请查看此文件??“Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl”.
要使用相机深度请包含??“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” |
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” |
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 并选择你要添加的功能,
例如如果你使用了上面的示例代码 ,可以看到一个可用的材质槽
?
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/25 20:20:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |