如何让标准管线的自定义纹理重复Shader适配URP管线?
适配URP管线的RepeatShader修改方案
你的自定义Shader在URP中显示粉色,是因为标准管线的Surface Shader依赖内置渲染管线的光照实现,URP不兼容这套逻辑。以下是修改后的完整URP兼容版本:
Shader "Custom/URP_RepeatShader" { Properties{ _Color("Main Color", Color) = (1,1,1,1) _MainTex("Base (RGB)", 2D) = "white" {} _Scale("Texture Scale", Float) = 1.0 } SubShader{ Tags{ "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" // 标记适配URP } LOD 200 HLSLPROGRAM #pragma surface surf Standard fullforwardshadows // 使用URP支持的Standard光照模型 #pragma target 3.0 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" sampler2D _MainTex; fixed4 _Color; float _Scale; struct Input { float3 worldNormal; float3 worldPos; }; void surf(Input IN, inout SurfaceOutputStandard o) { float2 UV; fixed4 c; if (abs(IN.worldNormal.x) > 0.5) { UV = IN.worldPos.yz; // 侧面UV c = tex2D(_MainTex, UV * _Scale); } else if (abs(IN.worldNormal.z) > 0.5) { UV = IN.worldPos.xy; // 正面UV c = tex2D(_MainTex, UV * _Scale); } else { UV = IN.worldPos.xz; // 顶部UV c = tex2D(_MainTex, UV * _Scale); } o.Albedo = c.rgb * _Color; o.Alpha = c.a * _Color.a; } ENDHLSL } FallBack "Hidden/Universal Render Pipeline/FallbackError" }
关键修改点说明:
- 添加URP管线标记:在SubShader的Tags中加入
"RenderPipeline" = "UniversalPipeline",明确告知Unity该Shader适配URP。 - 替换光照模型与编译指令:
- 将
#pragma surface surf Lambert改为#pragma surface surf Standard fullforwardshadows,Standard是URP支持的PBR光照模型,fullforwardshadows启用完整前向阴影支持。 - 把
CGPROGRAM/ENDCG替换为HLSLPROGRAM/ENDHLSL,URP推荐使用HLSL语法规范。
- 将
- 引入URP核心库:添加
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl",获取URP的内置函数与定义。 - 更新SurfaceOutput结构:将
SurfaceOutput改为SurfaceOutputStandard,这是URP中用于PBR材质的标准输出结构。 - 修正Fallback:替换原Legacy管线的Fallback为URP专用的
"Hidden/Universal Render Pipeline/FallbackError",避免加载不兼容的降级Shader。 - 补充Alpha通道处理:添加
o.Alpha = c.a * _Color.a,保证材质透明通道正常工作。
内容的提问来源于stack exchange,提问作者erenjeager
相关产品推荐
相关产品推荐

