| 函数 | 功能描述 |
| lerp(a,b,f) | 涉及线性插值(1-f)*a+b*f,在这里,a和b可以匹配为一个矢量或标题类型,f可以是一个标量或者与a、b同类型的矢量。 |
一、创建shader、material、Plane
Shader "Custom/TerrainBlend" {
Properties {
_MainTint ("Diffuse Tint", Color) = (1,1,1,1)
_ColorA ("Terrain Color A", Color) = (1,1,1,1)
_ColorB ("Terrain Color B", Color) = (1,1,1,1)
_RTexture ("Red Channel Texture", 2D) = "" {}
_GTexture ("Green Channel Texture", 2D) = "" {}
_BTexture ("Blue Channel Texture", 2D) = "" {}
_ATexture ("Alpha Channel Texture", 2D) = "" {}
_BlendTex ("Blend Texture", 2D) = "" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
float4 _MainTint;
float4 _ColorA;
float4 _ColorB;
sampler2D _RTexture;
sampler2D _GTexture;
sampler2D _BTexture;
sampler2D _ATexture;
sampler2D _BlendTex;
struct Input {
float2 uv_RTexture;
float2 uv_GTexture;
float2 uv_BTexture;
float2 uv_ATexture;
float2 uv_BlendTex;
};
void surf (Input IN, inout SurfaceOutput o) {
//纹理采样
float4 blendData = tex2D (_BlendTex, IN.uv_BlendTex);
float4 rTexData = tex2D (_RTexture, IN.uv_RTexture);
float4 gTexData = tex2D (_GTexture, IN.uv_GTexture);
float4 bTexData = tex2D (_BTexture, IN.uv_BTexture);
float4 aTexData = tex2D (_ATexture, IN.uv_ATexture);
//使用lerp()函数(线性插值)对纹理进行混合。
float4 finalColor;
finalColor = lerp(rTexData, gTexData, blendData.g);
finalColor = lerp(finalColor, bTexData, blendData.b);
finalColor = lerp(finalColor, aTexData, blendData.a);
finalColor.a = 1.0;
o.Albedo = finalColor.rgb * _MainTint.rgb;
o.Alpha = finalColor.a;
}
ENDCG
}
FallBack "Diffuse"
}
二、运行效果