文章目录[隐藏]
shader转成URP shader时,发现ZTest在URP中无效,在官网demo中发现URP shader中如果想要实现ZTest, Stencil等 效果需要配合 renderer feature。

原Shader
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld' //空间角度(TODO钝角没有考虑) Shader "ZjwUnlit/AngleShader" { Properties { _Color("Color",Color)=(1,1,1,1) _Origin("Origin",vector)=(1,1,1,1) _Side1Pos("Side1Pos",vector)=(1,1,1,1) _Side2Pos("Side2Pos",vector)=(1,1,1,1) _OutlineColor("OutLineColor",Color)=(1,1,1,1) _OutlineRange("OutlineRange",Range(0,0.1))=0.01 [MaterialToggle]_IsOutline("IsOutline",int) = 0 } SubShader { Tags { "RenderType"="Geometry" } LOD 100 Pass { Cull Off ZTest Greater CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv:TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; float4 worldPos:TEXCOORD0; float2 uv : TEXCOORD1; }; fixed4 _Color; fixed4 _Origin; fixed4 _Side1Pos; fixed4 _Side2Pos; fixed4 _OutlineColor; fixed _OutlineRange; bool _IsOutline; bool CheckSide(float4 worldPos) { float3 ao=_Side1Pos-_Origin; float3 bo=_Side2Pos-_Origin; float3 normal=cross(bo,ao); fixed3 _Side1Normal=cross(normal,ao); fixed3 _Side2Normal=cross(bo,normal); float4 clip1Pos=(_Origin+_Side1Pos)/2; float4 clip2Pos=(_Origin+_Side2Pos)/2; float result1=dot(worldPos-clip1Pos,_Side1Normal); float result2=dot(worldPos-clip2Pos,_Side2Normal); return result1>0||result2>0; } v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.worldPos=mul(unity_ObjectToWorld,v.vertex); o.uv=v.uv.xy; return o; } fixed4 frag (v2f i) : SV_Target { bool result=CheckSide(i.worldPos); if(result) discard; float x = i.uv.x; float y = i.uv.y; float dis = sqrt(pow((0.5 - x), 2) + pow((0.5 - y), 2)); fixed tempOutline = _IsOutline ? _OutlineRange : 0; if (dis > 0.5 ) discard; return dis > 0.5 - tempOutline ? _OutlineColor : _Color; } ENDCG } Pass { Cull Off ZTest Always CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv:TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; float4 worldPos:TEXCOORD0; float2 uv : TEXCOORD1; }; fixed4 _Color; fixed4 _Origin; fixed4 _Side1Pos; fixed4 _Side2Pos; fixed4 _OutlineColor; fixed _OutlineRange; bool _IsOutline; bool CheckSide(float4 worldPos) { float3 ao=_Side1Pos-_Origin; float3 bo=_Side2Pos-_Origin; float3 normal=cross(bo,ao); fixed3 _Side1Normal=cross(normal,ao); fixed3 _Side2Normal=cross(bo,normal); float4 clip1Pos=(_Origin+_Side1Pos)/2; float4 clip2Pos=(_Origin+_Side2Pos)/2; float result1=dot(worldPos-clip1Pos,_Side1Normal); float result2=dot(worldPos-clip2Pos,_Side2Normal); return result1>0||result2>0; } v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.worldPos=mul(unity_ObjectToWorld,v.vertex); o.uv=v.uv.xy; return o; } fixed4 frag (v2f i) : SV_Target { bool result=CheckSide(i.worldPos); if(result) discard; float x = i.uv.x; float y = i.uv.y; float dis = sqrt(pow((0.5 - x), 2) + pow((0.5 - y), 2)); fixed tempOutline = _IsOutline ? _OutlineRange : 0; if (dis > 0.5) discard; return dis > 0.5 - tempOutline ? _OutlineColor : _Color; } ENDCG } } } |
转换为URP shader
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 77 78 79 80 81 82 83 84 85 86 87 88 |
Shader "ZjwUnlit/AngleShader1" { Properties { _Color("Color",Color)=(1,1,1,1) _Origin("Origin",vector)=(1,1,1,1) _Side1Pos("Side1Pos",vector)=(1,1,1,1) _Side2Pos("Side2Pos",vector)=(1,1,1,1) _OutlineColor("OutLineColor",Color)=(1,1,1,1) _OutlineRange("OutlineRange",Range(0,0.1))=0.01 [MaterialToggle]_IsOutline("IsOutline",int) = 0 } SubShader { Tags { "RenderType"="Opaque" "RenderPipeline" = "UniversalPipeline" } LOD 100 Pass { HLSLPROGRAM #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl" struct appdata { half4 vertex : POSITION; half2 uv:TEXCOORD0; }; struct v2f { half4 vertex : SV_POSITION; half4 worldPos:TEXCOORD0; half2 uv : TEXCOORD1; }; half4 _Color; half4 _Origin; half4 _Side1Pos; half4 _Side2Pos; half4 _OutlineColor; half _OutlineRange; bool _IsOutline; bool CheckSide(half4 worldPos) { half3 ao=(_Side1Pos-_Origin).xyz; half3 bo=(_Side2Pos-_Origin).xyz; half3 normal=cross(bo,ao); half3 _Side1Normal=cross(normal,ao); half3 _Side2Normal=cross(bo,normal); half4 clip1Pos=(_Origin+_Side1Pos)/2; half4 clip2Pos=(_Origin+_Side2Pos)/2; half result1=dot((worldPos-clip1Pos).xyz,_Side1Normal); half result2=dot((worldPos-clip2Pos).xyz,_Side2Normal); return result1>0||result2>0; } v2f vert (appdata v) { v2f o; o.vertex = TransformObjectToHClip(v.vertex.xyz); o.worldPos=mul(unity_ObjectToWorld,v.vertex); o.uv=v.uv.xy; return o; } half4 frag (v2f i) : SV_Target { bool result=CheckSide(i.worldPos); if(result) discard; half x = i.uv.x; half y = i.uv.y; half dis = sqrt(pow((0.5 - x), 2) + pow((0.5 - y), 2)); half tempOutline = _IsOutline ? _OutlineRange : 0; if (dis > 0.5 ) discard; return dis > 0.5 - tempOutline ? _OutlineColor : _Color; } ENDHLSL } } } |
转载请注明:veyvin » URP 中实现ZTest