尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

如何生成自定义渲染Pass?LiliumToonGraph 的 Lilium Toon Target 源码完整剖析

如何生成自定义渲染Pass?LiliumToonGraph 的 Lilium Toon Target 源码完整剖析 如何生成自定义渲染PassLiliumToonGraph 的 Lilium Toon Target 源码完整剖析【免费下载链接】LiliumToonGraphUniversalRP Toon Shader with ShaderGraph项目地址: https://gitcode.com/gh_mirrors/li/LiliumToonGraphLiliumToonGraph 是一款基于 UniversalRP 的卡通Toon着色器项目它让 ShaderGraph 用户也能在 URP 中玩转卡通渲染。本文从 Lilium Toon Target自定义渲染 Target入手拆解 ToonTarget.cs 如何一步步生成 Forward、Outline、ShadowCaster、DepthOnly 四个自定义渲染 Pass并教你扩展自己的 Pass。上图为项目示例场景中的 Lilium Toon Target ShaderGraph左侧 MasterStack 上可见 Position/Normal/Tangent 与 Base Color 等输出插槽右侧 Inspector 展示了该 Target 的属性面板。一、为什么自定义渲染Pass需要自定义 Target在 Unity 的 ShaderGraph 中MasterStack 上的 Target 决定了最终生成的 SubShader 包含哪些渲染 Pass。URP 自带的UniversalTarget 只会生成 URP 标准的 Pass 组合无法满足卡通描边这类需求——描边本质上是一个额外的渲染通道。LiliumToonGraph 的思路是改造 UniversalTarget克隆出自己的 Lilium Toon Target在生成阶段注入自定义 Pass。由于需要访问 ShaderGraph 包的非公开Internal类作者还用一个巧妙手段——把程序集命名为 HDRP 的编辑器程序集名从而伪装出访问权限见 LiliumToonGraph.Editor.asmdefname: Unity.RenderPipelines.HighDefinition.Editor这也是 README.md 中HDRP 伪装一节解释的原理。创建入口则由菜单命令提供见 CreateToonShaderGraph.cs在 Project 窗口右键 →Create Shader Universal Render Pipeline Lilium Toon Shader Graph即可生成带 Toon Target 的 ShaderGraph。二、PassDescriptor自定义渲染Pass的配方每个 Pass 由一个PassDescriptor描述它规定了 Pass 的完整生成配方核心字段如下字段作用displayName/referenceName/lightModePass 名称、预处理器宏名、渲染状态机匹配模式passTemplatePath代码模板如PassMesh.template生成顶/片元入口函数骨架validVertexBlocks/validPixelBlocks端口掩码决定该 Pass 允许哪些 MasterStack 插槽参与requiredFields/structs强制携带的 Varyings/Attributes 字段renderStatesCull、ZTest、Blend 等渲染状态pragmas/keywords/includes编译指令、关键字、附加的 hlsl 代码以核心 PassDepthOnly / ShadowCaster为例见 ToonTarget.cs#L302-L355ShadowCaster 只开放 Alpha 相关片元插槽FragmentAlphaOnly掩码并强制要求normalOS字段用于阴影偏移——这正是端口掩码的典型用法同一个 MasterStack不同 Pass 看到不同的插槽。三、ToonTarget 默认生成的 4 个渲染 Pass在SubShaders区域ToonTarget.cs#L409-L452Target 声明了两组 SubShaderUnlit与UnlitDOTSDOTS 版本只是替换为 DOTS 实例化 pragmas每组按顺序包含 4 个 PassPasslightMode职责定义位置Lilium ToonUniversalForward主渲染 Pass输出卡通着色结果UnlitPasses.UnlitLilium Outline空无状态机匹配描边 Pass输出轮廓颜色UnlitPasses.OutlineShadowCasterShadowCaster投射阴影CorePasses.ShadowCasterDepthOnlyDepthOnly深度预渲染CorePasses.DepthOnly注意主 Pass 的displayName是 Lilium Toon 但lightMode是 URP 标准的UniversalForward——这样既保持与 URP 渲染管线兼容又能注入自己的 hlslToonIncludes.Forward 在片元图执行完之后追加 ToonForwardPass.hlsl构建InputData供卡通光照子图使用。四、描边Pass剖析Cull Front 反转网格描边 Pass 是 Lilium Toon Target 的招牌功能其实现非常简洁靠两点配合1. 反转渲染状态。见 ToonRenderStates.OutlineZTest Less ZWrite On // 让背面被正面深度挡掉只在轮廓外可见 Cull Front // 丢弃正面、只渲染背面网格2. 顶点阶段外扩 片元阶段输出描边色。在 ToonOutlinePass.hlsl 中顶点函数把 MasterStack 的OutlinePosition插槽结果赋给input.positionOS外扩后的位置片元函数最终返回half4(surfaceDescription.OutlineColor, alpha)ToonOutlinePass.hlsl#L133-L156——描边颜色完全由 ShaderGraph 节点驱动。描边 Pass 的端口掩码ToonBlockMasks额外开放了OutlineWidth与OutlinePosition两个顶点插槽以及OutlineColor片元插槽。五、自定义插槽如何接入 Pass除了内置的 URP 插槽Target 还声明了自己的插槽字段 ToonBlockFields.csOutlinePosition顶点阶段Position 控制OutlineColor片元阶段颜色控制默认灰色这些插槽通过GetActiveBlocksToonTarget.cs#L207-L219注册到 MasterStack之后在 PassDescriptor 的端口掩码中按需开放——声明插槽 → 注册到 Target → Pass 端口掩码放行三者缺一不可这就是 ShaderGraph 自定义渲染 Pass 的完整接线方式。Target 的属性面板Surface 类型、Alpha 混合模式、Alpha Clipping、法线空间等则在GetPropertiesGUI中定义并驱动renderQueue/renderTypeToonTarget.cs#L108-L130最终在Setup里写入各 SubShader 的渲染状态ToonTarget.cs#L153-L175。六、动手如何生成自己的自定义渲染Pass给 Lilium Toon Target 追加一个新 Pass例如一个发光预渲染通道的标准步骤新建 PassDescriptor参照UnlitPasses结构填写displayName、唯一的referenceName和lightMode需要状态机匹配则写明否则留空配置端口掩码用validVertexBlocks/validPixelBlocks决定新 Pass 能读取哪些插槽可复用CoreBlockMasks中现成的组合声明渲染状态与编译指令设置renderStatesZTest/Cull/Blend、pragmas建议至少包含 target 2.0 与 instancing附加 hlsl在includes中用IncludeLocation.Postgraph追加你自己的 Pass 实现文件像ToonIncludes.Outline那样ToonTarget.cs#L930-L939挂载到 SubShader把新 Pass 加入SubShaders.Unlit.passes的 PassCollection注意放在 ShadowCaster/DepthOnly 之前保证按预期顺序执行修改 kSourceCodeGuid源码依赖的 GUID 变化后需要所有 ShaderGraph 重新追加 Target——这也是 CHANGELOG.md 中 0.4.0 版本提示所有 ShaderGraph 需要重新做 Target 再追加作业的原因。⚠️需要提醒的是由于 LiliumToonGraph 依赖非公开 API对 URP 版本不具前后兼容性升级 URP 后可能需要重新调整 Target 代码。七、相关文件清单Target 主体与 Pass 定义ToonTarget.cs自定义插槽字段ToonBlockFields.cs主 Pass 片元实现ToonForwardPass.hlsl描边 Pass 实现ToonOutlinePass.hlsl创建菜单入口CreateToonShaderGraph.cs示例 ShaderGraph 与场景Toon.shadergraph、ToonSample.unity小结Lilium Toon Target 展示了 ShaderGraph 自定义 Target 生成渲染 Pass 的完整链路——用PassDescriptor写配方、用端口掩码切插槽、用 Postgraph include 注入 hlsl、用SubShaderDescriptor组装 Pass 序列。理解了这套机制你就能为 URP 的 ShaderGraph 加描边、加发光、加任何你需要的自定义渲染通道。【免费下载链接】LiliumToonGraphUniversalRP Toon Shader with ShaderGraph项目地址: https://gitcode.com/gh_mirrors/li/LiliumToonGraph创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表