过程是这样的:最近一直想做一个头像的mask效果,后来发现原来unity的mask需要用shader来写,网上找了不少资料,也能实现,不过大多数都是用render texture作为相机投影的texture。然后把这个相机的图像作为一个material,然后在ngui中创建一个texture,把这个material赋给texture。怎么说呢,这种方式虽然也能实现,但是必须要创建一个相机,对于一个大型项目来说有点不切实际。一个头像加个mask多简单的一件事,肯定有更好的办法。

最终还是找到了一种很好的方法,这种方法更接近想象中的方法,废话不多说了,跟我一步步做吧!

首先,我们需要新建一个shader。然后给他添加下面的代码。

在project试图中,右键->Create->Shader,新建一个shader,名字随便。

Shader "Unlit/Transparent Colored with mask" {
Properties {
_MainTex ("Base (RGB), Alpha (A)", 2D) = "white" {}
_AlphaTex ("Yeahyeah", 2D) = "white" {}
} SubShader{
LOD Tags{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
} Pass {
Cull Off
Lighting Off
ZWrite Off
Fog { Mode Off }
Offset -, -
ColorMask RGB
AlphaTest Greater .
Blend SrcAlpha OneMinusSrcAlpha
ColorMaterial AmbientAndDiffuse SetTexture [_MainTex] {
Combine Texture * Primary
} SetTexture [_AlphaTex] {
Combine previous, texture
}
}
}
}

顺便说下shader吧。太官方了可能不好理解,大概意思就是,在渲染的时候shader规定了某些规则,这些规则往往是用来实现某些炫酷的特效,或者为了某使些功能更高效。

代码中的Properties相当于unity脚本中的公共变量,当把shader赋给某个material时这些变量就能想出来,你可以给他赋值 ,跟unity脚本基本一样。

代码中的SubShader是子渲染器,这里面就能访问到前面设置的变量,这里主要是实现shader功能的地方,当然你还可以在这里面定义函数,等等,但是函数是用的一种叫Cg / HLSL的语言。

Pass,是渲染通道。这里可以设置一些参数来规定渲染方式。

好了基本就这样,要想具体了解shader,看unity官方的解释

好了我们接着做mask。如果shader代码能看懂的话,基本你也就会做了。

它主要做了两件事:

1,给两个texture赋值,其实就是两张图片。

2,把_AlphaTex中不透明的像素和_MainTex中的像素输出,其实就相当在MainTex中抠出一个AlphaTex中不透明的那部分形状一样的图块。

其实刚开始我搜到了不少shader,很多都没有提到怎么使用,下面来看一下

其实很简单,点击建好的shader在inspector面板中你会看到

从project视图中把两张图片拖上去就可以了。

MainTex是你要显示的图片

AlphaTex是你要抠图的形状,注意这张图除了形状可以用任何颜色以外其他必须都是透明的,而且图的大小要跟MainTex图片一样大。

最后就是使用了,用NGUI创建一个Texture,把shader拖到UITexture脚本的shader变量中,你会发现兴奋的事情发生啦!!最终效果如下:

OK,就到这里了,gook luck!

Unity3D在NGUI中使用mask的更多相关文章

  1. Thinking in Unity3D:渲染管线中的Rendering Path

      关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的 ...

  2. Unity3D使用NGUI实现简单背包功能

    前话 在许多类型游戏中我们经常会使用到背包,利用背包来设置相应角色属性,多了背包也会让游戏增色拓展不少. 那在Unity3D游戏开发中该如何编写背包系统呢?因为有高人开发了NGUI插件,因此我们进行简 ...

  3. [Unity3D]Unity3D叙利亚NGUI血液和技能的冷却效果

    ---------------------------------------------------------------------------------------------------- ...

  4. TDD在Unity3D游戏项目开发中的实践

    0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...

  5. ngui中 代码调用按钮事件(后来改成了按钮绑定键盘..)

    ngui中 代码调用按钮事件 好烦人啊这个问题, 我弄完发上来 这个问题解决了一半 发现可以用 按钮绑定来解决这个问题,并且更安全方便快速 直接在按钮上添加一个 key binding 指定按键 搞定 ...

  6. NGUI中Button与原生2D精灵的混合使用

    一些废话 每一篇的首段都是这个“一些废话”,原因是我太能逼逼了,不逼逼一些废话我就觉得难受.这是我第四篇关于Unity的博文,前两篇还是去年写的,“从一点儿不会开始”系列,类似教程和学习笔记的博文,这 ...

  7. iOS开发——UI篇&文字渐变效果:图层中的mask属性

    文字渐变效果:图层中的mask属性 本次文章,主要讲述的是图层中的mask属性,利用它,可以做出文字渐变效果! 一.文字渐变效果: 二.文字渐变实现思路: 1.创建一个颜色渐变层,渐变图层跟文字控件一 ...

  8. Unity NGUI中Anchor的用法

    unity版本 4.5.1 NGUI版本 3.6.5 通过NGUI中的Anchor设置按钮位置. 1.首先用NGUI创建两个按钮,按钮的创建在Hierachy窗口中必须按如下形式: Anchor用于确 ...

  9. 【Unity游戏开发】浅谈 NGUI 中的 UIRoot、UIPanel、UICamera 组件

    简介 马三最近换到了一家新的公司撸码,新的公司 UI 部分采用的是 NGUI 插件,而之前的公司用的一直是 Unity 自带的 UGUI,因此马三利用业余时间学习了一下 NGUI 插件的使用,并把知识 ...

随机推荐

  1. 把自己的电脑做服务器发布tomcat的项目外网访问

    1.首先你要确定你有一个外网ip地址.如果你分配到的是一个局域网IP地址需要经过一系列的转换为外网ip地址,然后继续下面操作. 2.拿到外网IP地址,进行tomcat的server.xml文件的配置. ...

  2. PowerDesigner设置线风格(直线,折线。。。)

    PowerDesigner中的绘图功能真是不敢恭维. 1.修改显示设置 Tools-->Display Preferences 这里有很多表现设置,我们需要的在Format菜单下. 点Modif ...

  3. 数据结构录 之 单调队列&单调栈。

    队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇的队列和栈的扩展. 其中最出名的应该是优先队列吧我觉得,然后还有两种比较小众的扩展就是单调 ...

  4. 并发数据(锁)ReaderWriterLockSlim

    ReaderWriterLockSlim 类 ReaderWriterLockSlim 类支持三种锁定模式:Read,Write,UpgradeableRead.这三种模式对应的方法分别是 Enter ...

  5. must override a superclass method

    <properties>        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>       ...

  6. ural1523 K-inversions

    K-inversions Time limit: 1.0 secondMemory limit: 64 MB Consider a permutation a1, a2, …, an (all ai  ...

  7. hibernate--联合主键--XML

    xml:composite-id 要重写equals,hashCode方法, 还要序列化 1. 新建一个主键类: StudentPK.java, 注意需要序列化.还要重写equals和hashCode ...

  8. Linux内核源代码目录树结构

    Linux内核源代码目录树结构. arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录.和32位PC相关的代码存放在i386目录下,其中比较重要的包括kernel(内核核心部分).mm(内 ...

  9. java中关于编码的问题(字符转换流及字符缓冲流 )

    上次我们使用的是字节流,还有一种方式就是字符流,上次说过如何分辨使用哪种流,如果记事本可以读懂则使用字符流,否则使用字节流.使用字符流就需要牵扯到编码的问题,下面给出一种转化流的格式. OutputS ...

  10. Laravel Eloquent get获取空的数据问题

    在用laravel框架来获取数据,若数据不存在时,以为会返回空,其实不是的,其实是一个 collection 值,会返回如下: object(Illuminate\Database\Eloquent\ ...