unity shader 可编程管线(一) 表面着色器SurfaceShader

SurfaceShader 是unity自己的特色着色器,可以理解为 顶点和片段着色器的融合体,后续也会单独介绍顶点和片段着色器。

Shader "基础/简单的SourfaceShader"   
{  
    //-------------------------------【属性】-----------------------------------------  
    Properties   
    {  
        _MainTex ("【纹理】Texture", 2D) = "white" {}  
        _BumpMap ("【凹凸纹理】Bumpmap", 2D) = "bump" {}  
        _RimColor ("【边缘颜色】Rim Color", Color) = (0.17,0.36,0.81,0.0)  
        _RimPower ("【边缘颜色强度】Rim Power", Range(0.6,9.0)) = 1.0  
    }  
  
    //----------------------------【开始一个子着色器】---------------------------  
    SubShader   
    {  
        //渲染类型为Opaque,不透明  
        Tags { "RenderType" = "Opaque" }  
  
        //-------------------开始CG着色器编程语言段-----------------  
        CGPROGRAM  
  
        //使用兰伯特光照模式  
        #pragma surface surf Lambert  
          
        //输入结构  
        struct Input   
        {  
            float2 uv_MainTex;//纹理贴图  
            float2 uv_BumpMap;//法线贴图  
            float3 viewDir;//观察方向  
        };  
  
        //变量声明  
        sampler2D _MainTex;//主纹理  
        sampler2D _BumpMap;//凹凸纹理  
        float4 _RimColor;//边缘颜色  
        float _RimPower;//边缘颜色强度  
  
        //表面着色函数的编写  
        void surf (Input IN, inout SurfaceOutput o)  
        {  
            //表面反射颜色为纹理颜色  
            o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;  
            //表面法线为凹凸纹理的颜色  
            o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));  
            //边缘颜色  
            half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));  
            //边缘颜色强度  
            o.Emission = _RimColor.rgb * pow (rim, _RimPower);  
        }  
  
        //-------------------结束CG着色器编程语言段------------------  
        ENDCG  
    }   
  
    //“备胎”为普通漫反射  
    Fallback "Diffuse"  
}

  1. tex2D,根据坐标,获取纹理上的颜色值
  2. UnpackNormal 获取法线。
  3. saturate 数据控制在[0,1]
  4. dot 向量点乘

效果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值