美文网首页
Unity的Shader复习(几个例子)

Unity的Shader复习(几个例子)

作者: 三十五岁是码农 | 来源:发表于2017-11-30 00:03 被阅读0次

项目导出了unitypackage上传到了Git

1.流动的水面

Shader "Custom/River" {
  Properties{
      _Color("Color", Color) = (1,1,1,1)
      _MainTex("Albedo (RGB)", 2D) = "white" {}
      _RiverSpeedX("X_Speed", range(2, 10)) = 7
      _RiverSpeedY("Y_Speed", range(2, 10)) = 7
  }
    SubShader{
        Tags { "RenderType" = "Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        fixed4 _Color;
        fixed _RiverSpeedX;
        fixed _RiverSpeedY;

        void surf(Input IN, inout SurfaceOutput o) {

          //_Time代表时间
          fixed xSpeed = _RiverSpeedX * _Time;
          fixed ySpeed = _RiverSpeedY * _Time;

          fixed2 uv = IN.uv_MainTex + fixed2(xSpeed, ySpeed);

          fixed4 c = tex2D(_MainTex, uv) * _Color;
          o.Albedo = c.rgb;
          o.Alpha = c.a;
      }
      ENDCG
      }
        FallBack "Diffuse"
}

2.地球的自转

Shader "Custom/Ball" {
    Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Color("Color", color) = (0, 0, 0, 0)
        _Alpha("Alpha", Range(0, 1)) = 0.5
        _RiverSpeedX("X_Speed", range(0.5, 10)) = 0.6
        _RiverSpeedY("Y_Speed", range(0.5, 10)) = 0.6
    }
    SubShader {
        Tags { "RenderType"="Transparent" }
        LOD 200
        
        CGPROGRAM
        //alpha表示透明
        #pragma surface surf Lambert alpha

        sampler2D _MainTex;
        fixed _Alpha;
        fixed _RiverSpeedX;
        fixed _RiverSpeedY;
        fixed4 _Color;

        struct Input {
            float2 uv_MainTex;
        };

        

        void surf (Input IN, inout SurfaceOutput o) {
            
            fixed xSpeed = _RiverSpeedX * _Time * 0.1;
            fixed ySpeed = _RiverSpeedY * _Time * 0.1;
            fixed2 uv = IN.uv_MainTex - fixed2(xSpeed, ySpeed);
            
            fixed4 c = tex2D (_MainTex, uv);
            o.Albedo = _Color.rgb;
            
            o.Alpha = _Color.a  * c.a * _Alpha;
        }
        ENDCG
    } 
//  FallBack "Diffuse" //可以产生阴影
}

3.带有法线贴图的(岩石表面)

Shader "Custom/RockShader" {
    Properties {
        _Color("Color", color) = (1, 1, 1, 1)
        _MainTex("MainTex", 2D) = "white"{}
        _BumpMap("BumpMap", 2D) = "bump"{}
        _Specular("Specular", range(0, 1)) = 0.6
    }
    SubShader {
        Tags { "RenderType" = "Opaque" }
        
        CGPROGRAM
        #pragma surface surf Lambert
        sampler2D _MainTex;
        sampler2D _BumpMap;     //法线贴图
        fixed4 _Color;
        float _Specular;
        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };
        
        void surf(Input IN, inout SurfaceOutput o)
        {
            o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
            o.Albedo *= _Color;
            o.Specular = _Specular;
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        }
        ENDCG
    } 
    FallBack "Diffuse"
}

4.最基本的

Shader "MS/FirstShader"
{
    Properties
    {
        _MainTex("贴图", 2D) = "white"{}
    }

    //核心,子着色器
    SubShader
    {
        //渲染模式 不透明
        Tags{"RenderType" = "opaque"}
        LOD 200
        
        //开始CG代码
        CGPROGRAM
        //声明着色器模式:表面着色器 , 光照模型:Lambert
        #pragma surface surf Lambert
        
        sampler2D _MainTex;
        
        //声明结构体Input
        struct Input
        {
            float2 uv_MainTex;
        };
        
        // 实现surf函数 , 该函数必须有两个参数:
        //Input 输入,SurfaceOutput(内置)输出
        void surf(Input IN, inout SurfaceOutput o)
        {
            o.Albedo = 0;   //环境光为白色
            o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
        }
        ENDCG   
    }
}

相关文章

网友评论

      本文标题:Unity的Shader复习(几个例子)

      本文链接:https://www.haomeiwen.com/subject/aijmbxtx.html