动画专业自学C#:Unity中合并两个Shader脚本的技术求助
嘿,作为动画专业还自己啃C#和Shader的同学必须点个赞!我把你要的两个Shader效果合并好了,直接看下面的代码就行——它同时实现了基于世界空间范围的淡入淡出和主纹理Alpha通道裁剪+忽略光照的效果:
合并后的完整Shader代码
Shader "Custom/CombinedFadeAndAlphaClip" { Properties { _MainTex ("Main Texture (Alpha for Clip)", 2D) = "white" {} _FadeCenter ("Fade Center (World Space)", Vector) = (0,0,0,0) _FadeRange ("Fade Range", Float) = 5.0 _FadeFalloff ("Fade Falloff", Float) = 2.0 } SubShader { Tags { "RenderType"="TransparentCutout" "Queue"="AlphaTest" } LOD 100 Lighting Off // 直接忽略场景光照设置 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 worldPos : TEXCOORD1; }; sampler2D _MainTex; float4 _MainTex_ST; float3 _FadeCenter; float _FadeRange; float _FadeFalloff; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; // 获取顶点的世界空间坐标 return o; } fixed4 frag (v2f i) : SV_Target { // 主纹理Alpha通道裁剪逻辑 fixed4 col = tex2D(_MainTex, i.uv); clip(col.a - 0.5); // 裁剪Alpha低于0.5的区域,可根据需求调整阈值 // 世界空间范围淡入淡出逻辑 float distanceToCenter = distance(i.worldPos, _FadeCenter); float fadeFactor = saturate((_FadeRange - distanceToCenter) / _FadeFalloff); col.a *= fadeFactor; // 将淡出因子叠加到纹理透明度上 return col; } ENDCG } } FallBack "Transparent/Cutout/VertexLit" }
关键效果说明
- 忽略光照:通过
Lighting Off标签直接禁用了光照计算,确保物体完全不受场景灯光影响 - Alpha裁剪:用
clip(col.a - 0.5)实现纹理Alpha通道的裁剪,你可以修改0.5这个数值来调整裁剪的严格程度 - 世界空间淡入淡出:在顶点着色器中把顶点坐标转换为世界空间,片元着色器计算顶点到指定中心的距离,通过
_FadeFalloff控制淡出的平滑过渡效果
你直接把这个Shader导入Unity,给物体挂上后就能在Inspector面板调整参数:
_MainTex:拖入带Alpha通道的纹理_FadeCenter:设置世界空间中的淡出中心点_FadeRange:控制淡出效果生效的范围_FadeFalloff:调整淡出过渡的平滑程度
内容的提问来源于stack exchange,提问作者Mauritz Seerden
相关产品推荐
相关产品推荐

