过程是这样的:最近一直想做一个头像的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. PAT (Advanced Level) 1070. Mooncake (25)

    简单贪心.先买性价比高的. #include<cstdio> #include<cstring> #include<cmath> #include<vecto ...

  2. .net core 13

  3. s15day14 ssh秘钥远程连接

    1 使用密钥登录    1.1 创建密钥对    1.2 上传公钥文件    1.3 导入公钥信息    1.4 使用密钥对登录2 远程执行命令    2.1 简单命令    2.2 使用脚本执行多命 ...

  4. Tomcat安装与配置

    Tomcat概述Tomcat是Apache 软件基 金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun 和其他一些公司及个人共同 ...

  5. 利用MyEclipse连接数据库并自动生成基于注解或者XML的实体类

    一.利用MyEclipse连接数据库 1. 打开MyEclipse的数据库连接视图 然后在Other中找到"MyEclipse Database"中的DB Browser 2. 在 ...

  6. 【HighCharts系列教程】九、语言属性——Lang

    一.lang属性说明 Lang属性主要用于配置显示的文字等语言相关属性. 主要可配置如下内容:小数点符号.导出相关文字.月份文字.星期文字等 lang属性不重要,无特殊情况,不用配置. 二.lang属 ...

  7. 转 mybatis javaType与jdbcType对应

    java.sql.Types 值 Java 类型 IBM DB2 Oracle Sybase SQL Informix IBM Content Manager   BIGINT java.lang.l ...

  8. nginx 生成 缩略图 and 生成缩略图到硬盘

    nginx  编译的时候增加  ./configure --with-http_image_filter_module 配置如下 server { listen     80; server_name ...

  9. 蘑菇街teamtalk简介

    这几天在看蘑菇街实时通讯程序teamtalk的安卓端代码.现在对程序的大概情况进行简单的介绍. 蘑菇街的teamtalk开源项目包含了服务器端,Android客户端和iPhone客户端的程序.想要进行 ...

  10. POJ3259负环判定

    题意:有n个顶点,m条边,然后有w个洞,过每个洞的时间为-ti,求是否会时光倒流 分析:就是求是否存在负圈,用Bellman-Floyd判定是否存在负圈即可,注意是无向图,所以路径是双向可达的 #in ...