地形混合shader
2017-04-05 20:32
190 查看
1.四个贴图混合
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
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
相关文章推荐
- Unity Shader Example 5 (地形混合)
- WOW地形Shader分析
- 【cocos2d-x 2.x 学习与应用总结】14: 自定义shader绘制混合颜色的矩形
- [OpenGL] 利用Shader实现复杂地形的渲染
- Fragment shader---片段颜色混合(接收阴影)
- Unity Shader (五)混合(Blend)
- 火云开发课堂 - 《Shader从入门到精通》系列 第二十节:在Shader中对3D模型进行多纹理混合
- Cg入门26:Fragment shader –纹理混合动画
- 基于高度进行混合的shader
- 地形的构建ogre地形shader 析解
- Shader Alpha混合
- Unity3D - Shader - 透明度混合
- 虚幻4地形混合材质蓝图连接
- UnityShader初级篇——透明度混合
- Unity3D ShaderLab压缩混合纹理贴图
- Shader -> Photoshop图层混合模式计算公式大全
- ComposeShader混合渲染
- Unity3D Shader官方教程翻译(十一)----Shader语法:Pass的Blending(混合)
- unity shader学习笔记(十一)——Unity中的透明效果之ShaderLab中的混合命令
- 3D地形多层纹理混合加阴影渲染方法