美文网首页
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