• 地形混合shader


    1.四个贴图混合

     1 Shader "Custom/BlendTex_surface" {
     2     Properties {
     3         _RTexture("Red Channel Texture", 2D) = "" {}
     4         _GTexture("Green Channel Texture", 2D) = "" {}
     5         _BTexture("Blue Channel Texture", 2D) = "" {}
     6         _ATexture("Alpha Channel Texture", 2D) = "" {}
     7         _Mask("Mask(RG)",2D) = ""{}
     8     }
     9     SubShader {
    10         Tags { "RenderType"="Opaque" }
    11         LOD 200
    12         
    13         CGPROGRAM
    14         #pragma surface surf Lambert
    15         #pragma target 4.0
    16 
    17         sampler2D _RTexture;
    18         sampler2D _GTexture;
    19         sampler2D _BTexture;
    20         sampler2D _ATexture;
    21 
    22         sampler2D _Mask;
    23 
    24         struct Input {
    25             float2 uv_RTexture;
    26             float2 uv_GTexture;
    27             float2 uv_BTexture;
    28             float2 uv_ATexture;
    29             float2 uv_Mask;
    30         };
    31 
    32         void surf (Input IN, inout SurfaceOutput o) {
    33             float4 rTexData = tex2D(_RTexture, IN.uv_RTexture);
    34             float4 gTexData = tex2D(_GTexture, IN.uv_GTexture);
    35             float4 bTexData = tex2D(_BTexture, IN.uv_BTexture);
    36             float4 aTexData = tex2D(_ATexture, IN.uv_ATexture);
    37             float4 blendData = tex2D(_Mask, IN.uv_Mask);
    38 
    39             float4 finalColor;
    40             //根据blendData.g 将 RTexture 和 GTexture 混合
    41             finalColor = lerp(rTexData, gTexData, blendData.g);//原本为g
    42             //根据blendData.b 将 BTexture 混合
    43             finalColor = lerp(finalColor, bTexData, blendData.b);//原本为b
    44             //根据blendData.a 将 ATexture 混合
    45             finalColor = lerp(finalColor, aTexData , blendData.a);//原本为a
    46             finalColor = saturate(finalColor);
    47             o.Albedo = finalColor.rgb;
    48             o.Alpha = finalColor.a;
    49         }
    50         ENDCG
    51     } 
    52     FallBack "Diffuse"
    53 }
    BlendTex_surface
      1 Shader "Custom/BlendTex_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     _Control ("Control (RGBA)", 2D) = "red" {}
     10     _IllumFactor ("Illumin Factor", Range(1,2)) = 1
     11 }
     12     
     13 SubShader 
     14 {
     15     Tags{ "Queue" = "Geometry+110"   }
     16     Pass 
     17     {
     18             
     19         Tags{"LightMode" = "ForwardBase" }
     20 
     21         CGPROGRAM
     22             #pragma vertex vert
     23             #pragma fragment frag
     24             #pragma target 2.0
     25             #include "UnityCG.cginc"
     26 
     27             sampler2D _Control;
     28             sampler2D Tex0;
     29             sampler2D Tex1;
     30             sampler2D Tex2;
     31             sampler2D Tex3; 
     32             half _IllumFactor;
     33 
     34             half4 Tex0_ST;
     35             half4 Tex1_ST;
     36             half4 Tex2_ST;
     37             half4 Tex3_ST;
     38             half4 _Control_ST;
     39 
     40 
     41             struct v2f
     42             {
     43                 float4    pos : SV_POSITION;
     44                 half2  uv_Tex0:TEXCOORD0;
     45                 half2  uv_Tex1:TEXCOORD1;
     46                 half2  uv_Tex2:TEXCOORD2;
     47                 half2  uv_Tex3:TEXCOORD3;
     48                 half2  uv_Control:TEXCOORD4;
     49             }; 
     50             
     51             struct appdata
     52             {
     53                 float4 vertex : POSITION;
     54                 float4 texcoord : TEXCOORD0;
     55             };
     56 
     57 
     58             v2f vert (appdata v)
     59             {
     60                 float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
     61 
     62                 v2f o;
     63             
     64                 o.uv_Control = v.texcoord.xy;
     65                 o.uv_Tex0 = TRANSFORM_TEX(v.texcoord ,Tex0);
     66                 o.uv_Tex1 = TRANSFORM_TEX(v.texcoord ,Tex1);
     67                 o.uv_Tex2 = TRANSFORM_TEX(v.texcoord, Tex2);
     68                 o.uv_Tex3 = TRANSFORM_TEX(v.texcoord, Tex3);
     69                 o.pos =  mul(UNITY_MATRIX_MVP, float4(v.vertex.xyz, 1));
     70 
     71                 return o;
     72             }
     73                 
     74 
     75             fixed4 frag(v2f i) : COLOR
     76             {
     77                 fixed4 splat_control = tex2D (_Control, i.uv_Control.xy);
     78             
     79                 fixed4 albedo = fixed4(1,1,1,1);
     80                 fixed4 Tex0Color = tex2D(Tex0, i.uv_Tex0);
     81                 //albedo.rgb  = splat_control.r * Tex0Color.rgb;...用这个会出现不明黑色阴影
     82                 fixed4 Tex1Color = tex2D(Tex1, i.uv_Tex1);
     83                 //albedo.rgb += splat_control.g * Tex1Color.rgb;
     84 
     85                 fixed4 Tex2Color = tex2D(Tex2, i.uv_Tex2).rgba;
     86                 //albedo.rgb += splat_control.b * Tex2Color;
     87                 fixed4 Tex3Color = tex2D(Tex3, i.uv_Tex3).rgba;
     88                 //albedo.rgb += splat_control.a * Tex3Color;
     89                 
     90                 albedo = lerp(Tex0Color,Tex1Color, splat_control.g);
     91                 albedo = lerp(albedo,Tex2Color, splat_control.b);
     92                 albedo = lerp(albedo,Tex3Color, splat_control.a);
     93 
     94                 return albedo* _IllumFactor;
     95             }
     96 
     97         ENDCG
     98     }    
     99 }
    100     FallBack "Diffuse"
    101 }
    BlendTex_vertfrag

    2.四个贴图(加法线)混合

     1 Shader "Custom/BlendNormalTex_surface" {
     2     Properties {
     3         _RTexture("Red Channel Texture", 2D) = "" {}
     4         _GTexture("Green Channel Texture", 2D) = "" {}
     5         _BTexture("Blue Channel Texture", 2D) = "" {}
     6         _ATexture("Alpha Channel Texture", 2D) = "" {}
     7 
     8         _RNormalTex ("RNormal Map", 2D) = "bump" {}
     9         _GNormalTex ("GNormal Map", 2D) = "bump" {}
    10         _BNormalTex ("BNormal Map", 2D) = "bump" {}
    11         _ANormalTex ("ANormal Map", 2D) = "bump" {}
    12 
    13         _RNormalIntensity ("RNormal Map Intensity", Range(-1,1)) = 1
    14         _GNormalIntensity ("GNormal Map Intensity", Range(-1,1)) = 1
    15         _BNormalIntensity ("BNormal Map Intensity", Range(-1,1)) = 1
    16         _ANormalIntensity ("ANormal Map Intensity", Range(-1,1)) = 1
    17         _IllumFactor ("Illumin Factor", Range(1,2)) = 1
    18         
    19         
    20         
    21         _Mask("Mask(RG)",2D) = ""{}
    22     }
    23     SubShader {
    24         Tags { "RenderType"="Opaque" }
    25         LOD 200
    26         
    27         CGPROGRAM
    28         #pragma surface surf Lambert
    29         // #pragma surface surf Lambert vertex:vert
    30         #pragma target 4.0
    31 
    32         sampler2D _RTexture,_GTexture,_BTexture,_ATexture;
    33         sampler2D _RNormalTex,_GNormalTex,_BNormalTex,_ANormalTex;
    34         float _RNormalIntensity,_GNormalIntensity,_BNormalIntensity,_ANormalIntensity;
    35         float _IllumFactor;
    36 
    37         sampler2D _Mask;
    38 
    39         struct Input {
    40             float2 uv_RTexture;
    41             float2 uv_GTexture;
    42             float2 uv_BTexture;
    43             float2 uv_ATexture;
    44             float2 uv_RNormalTex;
    45             float2 uv_GNormalTex;
    46             float2 uv_BNormalTex;
    47             float2 uv_ANormalTex;
    48             float2 uv_Mask;
    49         //    float3 m_normal;
    50         };
    51         void surf (Input IN, inout SurfaceOutput o) {
    52             float4 rTexData = tex2D(_RTexture, IN.uv_RTexture);
    53             float4 gTexData = tex2D(_GTexture, IN.uv_GTexture);
    54             float4 bTexData = tex2D(_BTexture, IN.uv_BTexture);
    55             float4 aTexData = tex2D(_ATexture, IN.uv_ATexture);
    56             float4 blendData = tex2D(_Mask, IN.uv_Mask);
    57 
    58             float4 finalColor;
    59             //根据blendData.g 将 RTexture 和 GTexture 混合
    60             finalColor = lerp(rTexData, gTexData, blendData.g);
    61             //根据blendData.b 将 BTexture 混合
    62             finalColor = lerp(finalColor, bTexData, blendData.b);
    63             //根据blendData.a 将 ATexture 混合
    64             finalColor = lerp(finalColor, aTexData , blendData.a);
    65             finalColor = saturate(finalColor);
    66 
    67 
    68             float3 rNormalMap = UnpackNormal(tex2D(_RNormalTex, IN.uv_RNormalTex));
    69             rNormalMap.xy*=_RNormalIntensity;
    70             float3 gNormalMap = UnpackNormal(tex2D(_GNormalTex, IN.uv_GNormalTex));
    71             gNormalMap.xy*=_GNormalIntensity;
    72             float3 bNormalMap = UnpackNormal(tex2D(_BNormalTex, IN.uv_BNormalTex));
    73             bNormalMap.xy*=_BNormalIntensity;
    74             //bNormalMap.z=sqrt(1.0-saturate(dot(bNormalMap.xy,bNormalMap.xy)));这个似乎并没有效果
    75             float3 aNormalMap = UnpackNormal(tex2D(_ANormalTex, IN.uv_ANormalTex));
    76             aNormalMap.xy*=_ANormalIntensity;
    77 
    78             float3 finalNormal;
    79             //根据blendData.g 将 RTexture 和 GTexture 混合
    80             finalNormal = lerp(rNormalMap, gNormalMap, blendData.g);
    81             //根据blendData.b 将 BTexture 混合
    82             finalNormal = lerp(finalNormal, bNormalMap, blendData.b);
    83             //根据blendData.a 将 ATexture 混合
    84             finalNormal = lerp(finalNormal, aNormalMap , blendData.a);
    85 
    86             o.Albedo =finalColor*_IllumFactor;
    87             o.Alpha = finalColor.a;
    88             o.Normal=finalNormal;
    89             //o.Normal=rNormalMap*blendData.r+gNormalMap*blendData.g+bNormalMap*blendData.b+aNormalMap*blendData.a;
    90         }
    91         ENDCG
    92     } 
    93     FallBack "Diffuse"
    94 }
    BlendNormalTex_surface
      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

  • 相关阅读:
    HDU 1232 畅通工程(并查集分析)
    NYOJ 2 括号配对问题
    HDU 1205 吃糖果
    HDU 1201 18岁生日
    [ACM] hdu Find a way
    [ACM] hdu Ignatius and the Princess I

    pongo(英雄会)编程挑战: 人人code,整数取反
    [ACM] POJ 1852 Ants
    波司登杯2013微软office应用创意大赛烟台大学校园赛参赛历程
  • 原文地址:https://www.cnblogs.com/luxishi/p/6670487.html
Copyright © 2020-2023  润新知