目录
一、前言
二、准备模型
三、 场景准备
四、代码准备
五、透明度设置
六、补充介绍
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,可以选择这些被挡住的东西要不要显示出来,显示哪部分颜色?
ColorMask R,意思是输出颜色中只有R通道会被写入
ColorMask G,意思是输出颜色中只有G通道会被写入
ColorMask B,意思是输出颜色中只有B通道会被写入
ColorMask A,意思是输出颜色中只有A通道会被写入
ColorMask RGB 或者GB,或者RB等,或者其他组合,然后相应的通道会被写入
ColorMask 0,清空所有颜色
我们希望所有遮挡的都不显示,就用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
}
}
七、作者的碎碎念
你们还想看什么效果,记得留言哦~