欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity 2019.3中为Sprite新引入的“Secondary Texture”中比较特殊的“Normal Map”和“Mask Texture”的用法详解

程序员文章站 2022-06-10 23:47:46
...

目录

一、”Normal Map“的用法

二、”Mask Texture“的用法

三、如何在代码中动态获取或者设置2D精灵(Sprite)的“Mask Texture”和“Normal Map”?


在Unity的2D光照系统中,2D精灵(Sprite)可以通过添加“Secondary Texture”来丰富精灵(Sprite)的表现形式,一个2D精灵(Sprite)允许添加最多8个”Secondary Texture“,而其中有两类比较特殊的贴图,一个是”Normal Map“,另一个就是”Mask Texture“,它们之所以特殊,就是因为它们是2D光照系统中定义好行为的贴图(Texture),通过给2D精灵(Sprite)添加”Normal Map“或者”Mask Texture“可以增强2D精灵(Sprite)在2D光照下的表现形式,具体说明可以参见我的另一篇原创技术博客。下面我们将分别讲解”Normal Map“和”Mask Texture“的详细用法。

在使用”Normal Map“和”Mask Texture“之前需要明确一点:这里提到的”Normal Map“和”Mask Texture“是作为”Secondary Texture“赋给2D精灵(Sprite),并且需要配合Unity官方提供的2D光照系统才能发挥作用,和3D游戏中类似的概念没有关系。比如,3D游戏中也有法线贴图(Normal Map)的概念,不过和这里的法线贴图(Normal Map)无关,虽然在概念上无关,但是在制作方法上是一样的。

 

一、”Normal Map“的用法


1、为2D精灵(Sprite)创建专属的法线贴图(Normal Map):我们要使用第三方的软件才能为2D精灵(Sprite)创建专属的法线贴图(Normal Map),创建2D精灵(Sprite)使用的法线贴图(Normal Map)和创建3D模型(Model)使用的法线贴图(Normal Map)的步骤是一样的。创建法线贴图(Normal Map)的软件有很多,比如:xNormalSpriteIlluminator等。这些软件的具体用法可以上网搜,网上的资源一大堆。

2、将创建好的法线贴图(Normal Map)赋给2D精灵(Sprite):具体方法请参见官方文档其中有两点需要特别注意,第一点就是将制作好的法线贴图(Normal Map)导入到Unity编辑器中的时候,图片资源在Inspector面板上的“Texture Type”属性应该选择“Sprite (2D and UI)”,而不是“Normal map”(如果想要知道原因,可以参见我的另一篇原创技术博客),第二点就是在Sprite Editor中为2D精灵(Sprite)添加法线贴图(Normal Map)的时候,“Secondary Texture”的“Name”属性值不能乱写,必须用2D光照系统指定的字符串常量,即“_NormalMap”,我们可以通过点击输入框后面的下拉列表来选择这个字符串常量(如果想要知道原因,可以参见我的另一篇原创技术博客)。

3、设置2D精灵(Sprite)的法线贴图(Normal Map),让它在场景中发挥作用:经过上面两个步骤之后,我们还需要设置一个关键的属性,否则我们无法看到2D精灵(Sprite)添加法线贴图(Normal Map)之后的效果,这个关键的属性就是“Light 2D”组件的“Use Normal Map”属性,我们需要勾选这个属性(默认没有勾选),勾选这个属性之后会有新的属性出现,它们是用来设置2D精灵(Sprite)添加法线贴图(Normal Map)之后的表面效果。这个时候我们才可以在Unity官方提供的2D光照下看到2D精灵(Sprite)添加法线贴图(Normal Map)之后的效果了,那种“图像表面的凹凸感和光影效果”都呈现出来了

 

 

二、”Mask Texture“的用法


1、为2D精灵(Sprite)创建专属的”Mask Texture“:和法线贴图(Normal Map)一样,“Mask Texture”也不能在Unity编辑器中创建,必须要借助第三方的软件来创建。这样的软件有很多,几乎所有的图形编辑软件都可以,比如:PhotoShop、GIMP等等。虽然“Mask Texture”的形状可以是多种多样的,不过我们最常用的形状还是2D精灵(Sprite)本身的形状,所以创建“Mask Texture”最常见的步骤就是将2D精灵(Sprite)使用的图片导入到图形编辑软件之后,再按照要求,将图片的RGBA四个通道调节到我们需要的数值,一般来说RGBA四个通道的值不一定都要设置,项目中用到哪个通道就设置哪个通道的值,在项目中同一时刻同一个光源只会使用到其中一个通道的数值,不过不同的光源可以使用不同通道的数值(如果想要了解“Mask Texture”的作用以及作用的原理可以参见我的另一篇原创技术博客)。综上所述,我们在为2D精灵(Sprite)创建专属的”Mask Texture“的时候,核心的操作就是编辑“Mask Texture”图片的RGBA四个通道的数值,按照项目的要求,使用哪个通道就设置哪个通道的数值。

2、将创建好的”Mask Texture“赋给2D精灵(Sprite):具体方法请参见官方文档其中有两点需要特别注意,第一点就是将制作好的”Mask Texture“导入到Unity编辑器中的时候,图片资源在Inspector面板上的“Texture Type”属性应该选择“Sprite (2D and UI)”,而不是“Default”(如果想要知道原因,可以参见我的另一篇原创技术博客),第二点就是在Sprite Editor中为2D精灵(Sprite)添加”Mask Texture“的时候,“Secondary Texture”的“Name”属性值不能乱写,必须用2D光照系统指定的字符串常量,即“_MaskTex”,我们可以通过点击输入框后面的下拉列表来选择这个字符串常量(如果想要知道原因,可以参见我的另一篇原创技术博客)。

3、设置2D精灵(Sprite)的”Mask Texture“,让它在场景中发挥作用:我们会发现,即使我们通过上面两个步骤为2D精灵(Sprite)成功添加”Mask Texture“后也可能不会达到我们预期的效果,原因是我们还需要做一些额外的设置我们需要设置的点有以下几个:
(1)“2D Renderer”资源文件的Inspector面板上的“Light Blend Styles”栏目下预定义的4个Style属性(目前预定义的是4个Style,我们不能添加,但是不排除后面的版本会添加更多的预定义Style,或者允许我们自己添加Style),我们并不需要对4个预定义的Style属性都进行设置,用到哪个Style就设置哪个Style,至于如何指定用到哪个Style,见下面的(2)。关于前面提到的“Light Blend Styles”栏目和它下面Style属性值的详细讲解,可以参见官方文档我们如果想要精灵(Sprite)上添加的“Mask Texture”发挥作用,那么前面提到的Style属性下的“Mask Texture Channel”这个子属性的属性值就不能设置成“None”(默认是None),应该从“Mask Texture”图片的RGBA四个通道中选择一个发挥作用的通道(其中的原理可以参见我的另一篇原创技术博客)。

(2)指定我们使用的Style(指定“Mask Texture”图片RGBA四个通道中的某一个通道发挥作用的属性“Mask Texture Channel”就是在Style属性下设置的):指定哪个Style发挥作用的属性是充当光源的游戏物体上挂载的“Light 2D”组件中的“Blend Style”属性,这个属性可选的值就是(1)中提到的“Light Blend Styles”栏目下Style属性值的“Name”子属性设置的值,“Blend Style”属性值选择了哪个“Name”值,那么这个“Name”值对应的Style才会发挥作用(如果想要了解这个作用的原理,可以参见我的另一篇原创技术博客)。

通过上面几个步骤的设置,“Mask Texture”这个时候才算是开始发挥作用了。如果想要详细了解“Mask Texture”的作用,可以参见我的另一篇原创技术博客

 

 

三、如何在代码中动态获取或者设置2D精灵(Sprite)的“Mask Texture”和“Normal Map”?


其实为2D精灵(Sprite)添加“Mask Texture”和“Normal Map”的方法有两种第一种就是上面介绍的通过“Sprite Editor”窗口中的“Secondary Texture”选项进行添加,这种方法是我们常用的方法,相比于第二种方法这种方法属于”全局设置“,不过这种方法有一个缺陷,就是我们无法在代码中动态获取或者设置2D精灵(Sprite)的“Mask Texture”和“Normal Map”。第二种就是通过新建的Material为2D精灵(Sprite)添加“Mask Texture”和“Normal Map”,方法就是新建一个Material,这个Material默认使用的是“Sprite-Lit-Default”这个Shader,这个Shader有三个属性,分别是”Diffuse”、“Mask”和“Normal Map”,其中“Mask”和“Normal Map”属性就是用来设置2D精灵(Sprite)的“Mask Texture”和“Normal Map”的地方,设置好对应的贴图后,将这个新建的Material拖到2D精灵(Sprite)这个游戏物体”Sprite Renderer“组件的”Material“属性中就可以了,通过这种方法为2D精灵(Sprite)添加的”Mask Texture“和”Normal Map“就可以在代码中进行动态获取或者动态设置,具体代码如下:

using UnityEngine;

public class MaskTextureAndNormalMap : MonoBehaviour 
{
	private SpriteRenderer sr;

	// Use this for initialization
	private void Start () 
	{
		sr = GetComponent<SpriteRenderer>();
		print(sr.material.GetTexture("_MainTex"));    // 永远返回null,通过sr.sprite获取
		print(sr.material.GetTexture("_MaskTex"));    // 只用通过新建一个Material,使用Sprite-Lit-Default这个Shader,然后通过Shader的"Mask"属性赋值"Mask Texture"才能获取到,如果通过“Texture Editor”的“Secondary Texture”添加“Mask Texture”,那么就获取不到,只会返回Null、
		print(sr.material.GetTexture("_NormalMap"));  // 只用通过新建一个Material,使用Sprite-Lit-Default这个Shader,然后通过Shader的"Normal Map"属性赋值"Normal Map"才能获取到,如果通过“Texture Editor”的“Secondary Texture”添加“Normal Map”,那么就获取不到,只会返回Null、

		// 动态设置贴图的方法
		// sr.material.SetTexture("_MaskTex", Texture类型的对象);    // 设置精灵(Sprite)的“Mask Texture”,不过要求和上面获取方法一样。
		// sr.material.SetTexture("_NormalMap", Texture类型的对象);  // 设置精灵(Sprite)的“Normal Map”,不过要求和上面获取方法一样。

		// 上面字符串常量"_MainTex"、"_MaskTex"和"_NormalMap"是写死的,因为这些字符串常量表示Shader中定义的变量的变量名,Sprite-Lit-Default这个Shader中定义的变量名就是这样的。

		// 综上所述,如果我们想要通过代码动态操作精灵(Sprite)的“Mask Texture”和“Normal Map”,那么就只能通过新建一个Material,使用Sprite-Lit-Default这个Shader,然后再利用这个Shader的“Mask Texture”和“Normal Map”属性为精灵(Sprite)赋予对应的贴图。
		//		  如果我们不需要通过代码动态操作精灵(Sprite)的“Mask Texture”和“Normal Map”,那么我们还是建议使用“Sprite Editor”的“Secondary Texture”为精灵(Sprite)赋予对应的贴图。
		// 注意:如果使用“Sprite Editor”的“Secondary Texture”为精灵(Sprite)赋予“Mask Texture”或者“Normal Map”,那么再通过新建一个Material,使用Sprite-Lit-Default这个Shader对应的“Mask”属性和“Normal Map”属性为精灵(Sprite)赋予对应的贴图,这个操作不会起作用,因为前者方法赋予的贴图的优先级大于后者方法赋予的贴图的优先级。
	}
}

对于上面的两种方法,有几点需要我们注意:
(1)通过第二种方法为2D精灵(Sprite)添加的”Mask Texture“和”Normal Map“的图片资源同样需要设置成”Sprite (2D and UI)“的类型;

(2)通过第二种方法为2D精灵(Sprite)添加的”Mask Texture“和”Normal Map“在添加到Shader对应的属性中的时候,对应的贴图属性是没有办法调节的,即使调节了也没有效果(这些属性有”Tiling“和”Offset“);

(3)如果我们通过上面第一种方法为2D精灵(Sprite)设置了”Mask Texture“或者”Normal Map“,那么再通过上面第二种方法对同一个2D精灵(Sprite)设置”Mask Texture“或者”Normal Map“就不会起作用了,因为第一种方法设置的”Mask Texture“和”Normal Map“的优先级更高,2D精灵(Sprite)会选择优先级更高的贴图使用。

(3)第一种方法是通过”Sprite Editor“为2D精灵(Sprite)添加”Mask Texture“或者”Normal Map“,这属于”全局设置“的方法,以后我们再将2D精灵(Sprite)拖入到场景中,它就拥有”Mask Texture“或者”Normal Map“了,而第二种方法是通过单独的Material为2D精灵(Sprite)添加”Mask Texture“或者”Normal Map“,这属于”个体设置“的方法,以后我们再将2D精灵(Sprite)拖入到场景中,它不会拥有”Mask Texture“或者”Normal Map“,除非我们为这个2D精灵(Sprite)赋予修改后的Material。

相关标签: Unity 2D 光照