我们在shader中添加三张贴图来做遮罩,猪脚一张、火盆三张,分别为
_Mask ("Mask", 2D) = "white" {}
_Mask0 ("Mask0", 2D) = "white" {}
_Mask1 ("Mask1", 2D) = "white" {}
在纹理混合中进行如下设置:
SetTexture [_Mask] {combine texture}
SetTexture [_MainTex] {combine texture,texture-previous}
SetTexture [_Mask0] {combine previous,previous-texture}
SetTexture [_Mask1] {combine previous,previous-texture}
SetTexture 的原理在
unity用shader遮罩模拟黑夜火把照明效果
中有说过,这里就不详细说了
总之就是将上一步计算的的alpha通道值减去这张贴图的alpha通道值就是了。
保存一下,回到我们的主界面,将我们的遮罩贴图拖到三个子贴图中,
但是这样场景中只看到了一个光圈。
我们把他的offset都偏移一下,这样三个就齐了。
将光圈对准火盆与光圈跟随猪脚移动原理一样。
下一步让光圈移到火盆处。
我们打开脚本,
脚本中添加:
public GameObject fire
public GameObject fire0
然后按照获得俩火盆的位置:
float firex = fire.transform.position.x
float firey = fire.transform.position.y
float fire0x = fire0.transform.position.x
float fire0y = fire0.transform.position.y
然后就是根据火盆的位置获得遮罩的偏移量:
float offsetfirex=-firex/(Le*2f)
float offsetfirey=-firey/(Wi*2f)
float offsetfire0x=-fire0x/(Le*2f)
float offsetfire0y=-fire0y/(Wi*2f)
最后是改变遮罩的位置:
renderer.material.SetTextureOffset ("_Mask0", new Vector2 (offsetfirex,offsetfirey))
renderer.material.SetTextureOffset ("_Mask1", new Vector2 (offsetfire0x,offsetfire0y))
OK,回到场景运行,测试一下效果不错:
我们最后让火盆的光圈也能和猪脚一样忽大忽小:
我们在如图所示脚本位置添加:
renderer.material.SetTexture("_Mask0",mask[i])
renderer.material.SetTexture("_Mask1",mask[i])
具体脚本如下:
f(Time.time>b){
b=b+c
if(i<mask.Length-1){
i++
}else
{
i=0
}
renderer.material.SetTexture("_Mask",mask[i])
renderer.material.SetTexture("_Mask0",mask[i])
renderer.material.SetTexture("_Mask1",mask[i])
}
原理就是循环一组大小不同的的光圈图片作为遮罩的贴图,具体在
unity 贴图动画实现照明忽大忽小
http://jingyan.baidu.com/article/72ee561a58724ae16138df25.html
里面说过,就不详细说了。
最终脚本如下图:
OK,最终效果如下图,很不错吧!
blender的shader节相对容易理解,不过其中依旧有一些需要注意的地方,这里会说明一些常用的shader节点
作用:当需要将两个shader相加或混合到一起使用
一般很少会使用到Add shader,而Mix shader是一个十分常用的节点。
Add shader会把两个shader直接相加后显示结果,即: value_out = value_1 + value_2 , 所以结果往往会不符合现实情况
Mix shader会通过Fac去控制两个shader的比重,即: value_out = value_1 * Fac + value_2 * (1 - Fac) ,所以可以通过控制Fac得到更加真实的结果,比如混合Diffuse BSDF和Glossy BSDF为物体添加漫反射和反射。
作用:为物体添加漫反射,添加在一些没有反射的表面如沙丘、粗糙的木头等
Color参数控制漫反射的颜色,Roughness能很微妙的控制表面粗糙
作用:为物体添加反射
Beckman:适合金属
GGX:适合金属以外的材质
Ashikhmin-Shirley:不知道
Roughness:通过模拟表面的凹凸来控制反射的模糊和清晰
作用:和Glossy BSDF相似,不过可以定向扭曲反射,比如用在类似平底锅下方的反射
Beckman、GGX、Ashikhmin-Shirley、Roughness和Glossy BSDF一样
Anisotropic:值为正时垂直扭曲反射,值为负时水平扭曲反射
Rotation:旋转扭曲的反射
Tangent:控制哪条轴向上的反射被扭曲
作用:当接触到光线时反射光线,同时根据IOR折射光线,可以在玻璃、水、宝石等材质上使用
IOR:控制光线折射的大小
作用:和Glass BSDF相同,除了这个shader不会产生反射
作用:让光线穿过,但transparent BSDF不会对光线产生任何影响
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)