目录

一、前言

二、准备模型

三、 场景准备

 四、代码准备

五、透明度设置

六、补充介绍

1.Pass语法介绍

2.ColorMask

 七、作者的碎碎念


一、前言

这节课的内容是接着弧形边缘光的效果之后做的。

Unity | Shader基础知识(第十四集:简单效果练习)_unity shader 实例-CSDN博客

做出的效果如(图1、2所示)

 

二、准备模型

我们学习嘛~随便来一个模型就行,可以在unity商店下一个,免费的。

我每次都会把素材准备写上,因为我初学的时候,总找不到素材。up下载的是这个(如图2所示)。

三、 场景准备

如果你和我下载的是同一个模型,你放进场景里(如图3所示)

 四、代码准备

下方是之前第十四集做弧形光的代码,我们在这个代码的基础上学。把这个代码的shader设置在材质球上。

Shader "Custom/012"
{
     Properties
    {
    _Color("Color",Color)=(0,0.5,0.5,0)
                        //这里把范围改成了0.5-20
    _Power("Power",Range(0.5,20)) = 3
    }

    SubShader
    {
            CGPROGRAM
            #pragma surface surf Lambert

            float4 _Color;
            float _Power;

            struct Input
            {
                float3 viewDir;
            };

            void surf(Input IN,inout SurfaceOutput o)
            {
                half dotp =1-saturate(dot(normalize(IN.viewDir),o.Normal));
                o.Emission =_Color.rgb * pow(dotp,_Power);
            }
            ENDCG
       }
}

 这个车里面有很多零件,假设我们现在只做车身。我们把车身的一些位置换成我们新写的材质。(如图4所示)

你也可以都换了,只是效果不一样而已。到此,我们其实已经获得了一个发光的车。材质的颜色可以调成自己喜欢的颜色,这里也略了。

五、透明度设置

全息的一个主要参与因素,就是颜色。因为现在还是教学,我们先只实现一个大概的效果。我们让现在不发光的地方透明。

(如图5所示)当红框的位置不等于0时,会发光,也就是说,这个数和0越接近,就越需要透明。

透明度本身就是0的时候是透明的,1的时候是实心的,所以,得出代码。

所以,得出代码如下:

            void surf(Input IN,inout SurfaceOutput o)
            {
                half dotp =1-saturate(dot(normalize(IN.viewDir),o.Normal));
                o.Emission =_Color.rgb * pow(dotp,_Power);
                //把透明度加进去
                o.Alpha = pow(dotp,_Power);
            }

加了透明度,别忘记了:

            Tags
            {
            "Queue" ="Transparent"
            }

            CGPROGRAM
            #pragma surface surf Lambert alpha:fade

 然后你就会得到(如图6所示)

因为颜色太单一了,就不太好看,我们希望渐变一点,就在 Emission里面增大一点,自发光是随着发光的强弱会变颜色的。

void surf(Input IN,inout SurfaceOutput o)
{
      half dotp =1-saturate(dot(normalize(IN.viewDir),o.Normal));
                                           //这里放大一点自发光倍数
      o.Emission =_Color.rgb * pow(dotp,_Power)*10;
      o.Alpha = pow(dotp,_Power);
}

你就会收到一个颜色渐变的车。(如图7所示)

这时候你去移动参数,已经有扫描的效果了。(如图8所示)

六、补充介绍

 上面的车在消失以后是可以看见内饰的,如果你需要一个看不见内部结构的车,就需要在shader里面添加新的代码。

1.Pass语法介绍

Pass的写法以前讲过了。

Unity | Shader基础知识(第二集:shader语言的格式)_unity shader语言-CSDN博客

Pass是通道的意思,可以在一个shader脚本里写不同的渲染,然后你就可以选择,调用哪一个pass(如图9所示)。

如果在所有地方都没有专门设置渲染哪个,不渲染哪个,先哪个后哪个,那所有pass会挨个渲染。

 那在这里旧事重提的原因是,有一些设定,智能写在pass里面,不能写在外面。

2.ColorMask

这是个什么东西呢?就是你再渲染这个材质所在的东西时,肯定视线里面不光有一个物体,肯定有很多。(如图10所示,所以我们车门后面有蓝色的其他内饰)。

如果你的车不是透明的,那肯定可以遮挡上。(如图10所示)

那透明的,如果我又不想显示后面怎么办? 

这时候我们就可以用ColorMask,可以选择这些被挡住的东西要不要显示出来,显示哪部分颜色?

我们希望所有遮挡的都不显示,就用0这个。

但是,这个只能写在Pass里,而且,我们是先清空,再画别的,所以这个Pass要写在前面。代码如下:

Shader "Custom/012"
{
     Properties
    {
    _Color("Color",Color)=(0,0.5,0.5,0)
    _Power("Power",Range(0.5,20)) = 3
    }

    SubShader
    {
            Tags
            {
            "Queue" ="Transparent"
            }

            //这里先把遮挡的都清空
            Pass{
            ColorMask 0
            }

            //然后再把别的显示出来
            CGPROGRAM
            #pragma surface surf Lambert alpha:fade

            float4 _Color;
            float _Power;

            struct Input
            {
                float3 viewDir;
            };

            void surf(Input IN,inout SurfaceOutput o)
            {
                half dotp =1-saturate(dot(normalize(IN.viewDir),o.Normal));
                o.Emission =_Color.rgb * pow(dotp,_Power)*10;
                o.Alpha = pow(dotp,_Power);
            }
            ENDCG
       }
}

 七、作者的碎碎念

你们还想看什么效果,记得留言哦~

06-26 17:10