UnityShader官方案例讲解——SurfaceShader(2)

“The best things are the most difficult.”

– Plutarch, Greek Historian

这一节我们将法线贴图放进shader

Shader"Example / AutisticPatient SurfaceShader3"
{
    Properties
    {
        _MainTex("MainTex",2D) = "white"{}
        //如果你想在这里放入法线贴图,那么初始值一定要是Bump
        _BumpMap("BumpMap",2D) = "Bump"{}
    }

    SubShader
    {
        Tags{"RenderType" = "Opaque"}
        CGPROGRAM
        #pragma surface surf Lambert

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

        sampler2D _MainTex;
        sampler2D _BumpMap;

        void surf(Input IN,inout SurfaceOutput o)
        {
            //tex2D是CG程序中用来对一张贴图(这里是_MainTex)中对一个点(IN.uv_MainTex)进行采样的方法
            //返回一个float4类型,并将其颜色的rgb值赋给了输出的像素颜色
            //总的来说,着色器会找到贴图上对应的UV坐标点,直接使用这个点的颜色信息rgb来进行着色.
            o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;
            //这里同理
            //unpcakNormal是接受fixed4类型的变量,然后转化为三维法线向量(fixed3)再赋值给标准输出结构体的Normal
            o.Normal = UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap));
        }


        ENDCG
    }

    FallBack"Diffuse"
}

下面是效果图
这里写图片描述

这里写图片描述
模型师asset store上down的 感谢美术前辈的免费分享

*step2*
接下来是边缘光效果(RimLighting)

部分代码跟以前重复,就直接copy了

 Shader "Example/Rim" 
 {
    Properties 
    {
      _MainTex ("Texture", 2D) = "white" {}
      _BumpMap ("Bumpmap", 2D) = "bump" {}
      _RimColor ("Rim Color", Color) = (0.26,0.19,0.16,0.0)     //边缘发光颜色 Rim Color  
      _RimPower ("Rim Power", Range(0.5,8.0)) = 3.0             //边缘发光强度 Rim Power  
    }
    SubShader 
    {
      Tags { "RenderType" = "Opaque" }

      CGPROGRAM
      #pragma surface surf Lambert
      struct Input 
      {
          float2 uv_MainTex;
          float2 uv_BumpMap;
          //viewDir(内置的变量) 定义了视角方向
          //内置变量还有很多,以后用到了再说,大家也可以自行查阅
          float3 viewDir;
      };

      sampler2D _MainTex;
      sampler2D _BumpMap;
      float4 _RimColor;
      float _RimPower;

      void surf (Input IN, inout SurfaceOutput o)
      {
          //tex2D是CG程序中用来对一张贴图(这里是_MainTex)中对一个点(IN.uv_MainTex)进行采样的方法
          //返回一个float4类型,并将其颜色的rgb值赋给了输出的像素颜色
          //总的来说,着色器会找到贴图上对应的UV坐标点,直接使用这个点的颜色信息rgb来进行着色.
          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;

          //unpcakNormal是接受fixed4类型的变量,然后转化为三维法线向量(fixed3)再赋值给标准输出结构体的Normal
          o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));

          //normalize用于获取到的viewDir坐标转成一个单位向量且方向不变 
          //然后在与点的法线做点积运算
          //最外层再用saturate算出[0,1]之间的最靠近(最小值但大于所指的值)的值。这样算出一个rim边界。
          //这里o.Normal就是单位向量,viewDir经过转化也是单位向量,所以夹角越小,cos值越大,反射上来的光也就越少,
          //这时候取反(也就是用1减去值)得到的值也就越小

          //取反是为了方便在Inspector面板中进行调试
          half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));

          //自发光,它直接从物体发出并且不受任何光源影响,
          //把这个值的变化率用一个pow函数(rim的_rimPower次方)进行放大,就能强化边缘发亮的效果.
          //大家可以把pow函数去掉试试效果
          o.Emission = _RimColor.rgb * pow (rim, _RimPower);
      }

      ENDCG
    } 

    Fallback "Diffuse"
  }

这里就不上效果图了 , 本身代码很简单,,而且 太晚了,,明天再继续

我总感觉倒数第二句代码的解释有点问题,如果路过的各位前辈能够知道下也是极好的呀( ⊙ o ⊙ )!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值