unity 遮罩shader怎么用

unity 遮罩shader怎么用,第1张

首先在场景中放几个火盆,随便你想放几个。当然这里放几个,后面shader里就需要几张遮罩贴图。这里我们放俩个火盆。

我们在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,最终效果如下图,很不错吧!

UNITY自带的SHADER放在:Assets\Standard Assets (Mobile)\Shaders 中,导入的时候会自动从这里加载所有的shaders工具。

Shader程序的基本结构

因为着色器代码可以说专用性非常强,因此人为地规定了它的基本结构。一个普通的着色器的结构应该是这样的:

首先是一些属性定义,用来指定这段代码将有哪些输入。接下来是一个或者多个的子着色器,在实际运行中,哪一个子着色器被使用是由运行的平台所决定的。子着色器是代码的主体,每一个子着色器中包含一个或者多个的Pass。在计算着色时,平台先选择最优先可以使用的着色器,然后依次运行其中的Pass,然后得到输出的结果。最后指定一个回滚,用来处理所有Subshader都不能运行的情况(比如目标设备实在太老,所有Subshader中都有其不支持的特性)。

需要提前说明的是,在实际进行表面着色器的开发时,将直接在Subshader这个层次上写代码,系统将把用户的代码编译成若干个合适的Pass。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/bake/11802668.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存