您的位置:首页 > 其它

地形混合shader

2017-04-05 20:32 190 查看
1.四个贴图混合

1 Shader "Custom/BlendNormalTex_vertfrag"
2 {
3 Properties
4 {
5     Tex0 ("Layer 0 (R)", 2D) = "white" {}
6     Tex1 ("Layer 1 (G)", 2D) = "white" {}
7     Tex2 ("Layer 2 (G)", 2D) = "white" {}
8     Tex3 ("Layer 3 (A)", 2D) = "white" {}
9
10     _Normal0("Normal 0 (A)", 2D) = "bump" {}
11     _Normal1("Normal 1 (B)", 2D) = "bump" {}
12     _Normal2("Normal 2 (G)", 2D) = "bump" {}
13     _Normal3("Normal 3 (R)", 2D) = "bump" {}
14
15     _BumpScale0("BumpScale 0", Range(-1.0,1.0)) = 1.0
16     _BumpScale1("BumpScale 1", Range(-1.0, 1.0)) = 1.0
17     _BumpScale2("BumpScale 2", Range(-1.0, 1.0)) = 1.0
18     _BumpScale3("BumpScale 3", Range(-1.0, 1.0)) = 1.0
19     _Control ("Control (RGBA)", 2D) = "red" {}
20     _IllumFactor ("Illumin Factor", Range(1,2)) = 1
21 }
22
23 SubShader
24 {
25     Tags{ "Queue" = "Geometry+110"   }
26     Pass
27     {
28
29         Tags{"LightMode" = "ForwardBase" }
30
31         CGPROGRAM
32             #pragma vertex vert
33             #pragma fragment frag
34             #pragma target 2.0
35             #include "UnityCG.cginc"
36             #include "Lighting.cginc"
37
38             sampler2D _Control;
39             //贴图及纹理
40             sampler2D Tex0,Tex1,Tex2,Tex3;
41             half4 Tex0_ST,Tex1_ST,Tex2_ST,Tex3_ST;
42             //法线贴图及纹理
43             sampler2D _Normal0,_Normal1,_Normal2,_Normal3;
44             half4 _Normal0_ST,_Normal1_ST,_Normal2_ST,_Normal3_ST;
45             half _BumpScale0, _BumpScale1, _BumpScale2, _BumpScale3;
46
47             half _IllumFactor;
48             half4 _Control_ST;
49
50
51             struct v2f
52             {
53                 float4    pos : SV_POSITION;
54                 float3 normal:NORMAL;
55                 float4 tangnent:TANGENT;
56                 half4  uv_Tex0:TEXCOORD0;
57                 half4  uv_Tex1:TEXCOORD1;
58                 half4  uv_Tex2:TEXCOORD2;
59                 half4  uv_Tex3:TEXCOORD3;
60                 half2  uv_Control:TEXCOORD4;
61                 half3 lightDir:TEXCOORD5;
62                 half3 viewDir:TEXCOORD6;
63             };
64
65             struct appdata
66             {
67                 float4 vertex : POSITION;
68                 float4 texcoord : TEXCOORD0;
69                 float4 tangent:TANGENT;
70                 float3 normal:NORMAL;
71             };
72
73
74             v2f vert (appdata v)
75             {
76                 v2f o;
77                 o.pos =  mul(UNITY_MATRIX_MVP, v.vertex);
78                 o.uv_Control = v.texcoord.xy;
79                 o.uv_Tex0.xy = TRANSFORM_TEX(v.texcoord ,Tex0);
80                 o.uv_Tex0.zw = TRANSFORM_TEX(v.texcoord ,_Normal0);
81
82                 o.uv_Tex1.xy = TRANSFORM_TEX(v.texcoord ,Tex1);
83                 o.uv_Tex1.zw = TRANSFORM_TEX(v.texcoord ,_Normal1);
84
85                 o.uv_Tex2.xy = TRANSFORM_TEX(v.texcoord, Tex2);
86                 o.uv_Tex2.zw = TRANSFORM_TEX(v.texcoord ,_Normal2);
87
88                 o.uv_Tex3.xy = TRANSFORM_TEX(v.texcoord, Tex3);
89                 o.uv_Tex3.zw = TRANSFORM_TEX(v.texcoord ,_Normal3);
90
91                 TANGENT_SPACE_ROTATION;
92                 o.lightDir=mul(rotation,ObjSpaceLightDir(v.vertex)).xyz;
93                 o.viewDir=mul(rotation,ObjSpaceViewDir(v.vertex)).xyz;
94
95                 return o;
96             }
97             fixed4 frag(v2f i):SV_Target
98             {
99                 fixed3 tangentLightDir=normalize(i.lightDir);
100                 fixed3 tangentViewDir=normalize(i.viewDir);//暂时没用到,用于补充高光
101
102
103                 fixed4 splat_control = tex2D (_Control, i.uv_Control.xy);
104
105
106                 fixed3 tangentNormal0=UnpackNormal(tex2D(_Normal0, i.uv_Tex0.zw));
107                 tangentNormal0.xy*=_BumpScale0;
108
109                 fixed3 tangentNormal1=UnpackNormal(tex2D(_Normal1, i.uv_Tex1.zw));
110                 tangentNormal1.xy*=_BumpScale1;
111
112                   fixed3 tangentNormal2=UnpackNormal(tex2D(_Normal2, i.uv_Tex2.zw));
113                 tangentNormal2.xy*=_BumpScale2;
114
115                   fixed3 tangentNormal3=UnpackNormal(tex2D(_Normal3, i.uv_Tex3.zw));
116                 tangentNormal3.xy*=_BumpScale3;
117
118                 fixed4 albedo = 0.0f;
119
120                 fixed4 Tex0Color = tex2D(Tex0, i.uv_Tex0);
121                 fixed4 Tex1Color = tex2D(Tex1, i.uv_Tex1);
122                 fixed4 Tex2Color = tex2D(Tex2, i.uv_Tex2);
123                 fixed4 Tex3Color = tex2D(Tex3, i.uv_Tex3);
124
125                 albedo = lerp(Tex0Color*max(0, dot(tangentNormal1, tangentLightDir)),Tex1Color*max(0, dot(tangentNormal1, tangentLightDir)), splat_control.g);
126                 albedo = lerp(albedo,Tex2Color*max(0, dot(tangentNormal2, tangentLightDir)), splat_control.b);
127                 albedo = lerp(albedo,Tex3Color*max(0, dot(tangentNormal3, tangentLightDir)), splat_control.a);
128
129                 return albedo*_IllumFactor;
130             }
131         ENDCG
132     }
133 }
134 FallBack "Diffuse"
135 }


BlendNormalTex_vertfrag
效果:



albedo = lerp(Tex0Color,Tex1Color, splat_control.g);

//splat_control.g*Tex0Color+(1-splat_control.g)*Tex1Color

工程文件:http://files.cnblogs.com/files/luxishi/BlendShader.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: