在Unity内建Shader的DefaultResourcesExtra的目录中,有一个很简单却很实用的shader——Decal。这是一个贴花着色器,可以在模型的表面添加一个贴花纹理。
Unity内建Shader下载地址。
如图所示:
(程序员的审美也就这样吧……)
我们看看Decal的代码:
Shader "Legacy Shaders/Decal" { Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Base (RGB)", 2D) = "white" {} _DecalTex ("Decal (RGBA)", 2D) = "black" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 250 CGPROGRAM #pragma surface surf Lambert sampler2D _MainTex; sampler2D _DecalTex; fixed4 _Color; struct Input { float2 uv_MainTex; float2 uv_DecalTex; }; void surf (Input IN, inout SurfaceOutput o) { fixed4 c = tex2D(_MainTex, IN.uv_MainTex); half4 decal = tex2D(_DecalTex, IN.uv_DecalTex); c.rgb = lerp (c.rgb, decal.rgb, decal.a); c *= _Color; o.Albedo = c.rgb; o.Alpha = c.a; } ENDCG } Fallback "Legacy Shaders/Diffuse" }
这是一个表面着色器,代码非常简单。
唯一要注意的是:
lerp (c.rgb, decal.rgb, decal.a)
实际上就等于:
decal.a*(decal.rgb-c.rgb)+c.rgb
也就等于:
decal.a*decal+(1-decal.a)*c.rgb
也就相当于使用了常规的混合模式(参考Shader山下(十八)混合(Blend)命令)
Blend SrcAlpha OneMinusSrcAlpha
(因为是Opaque,所以透明度也就无所谓了)
作者:ecidevilin 发表于2016/11/18 22:53:54 原文链接
阅读:13 评论:0 查看评论