TGEA中材质的使用(一)
这篇文章是以前写的文档(<TGEA入门指南>),后来整理了在游戏创造杂志上发表,简要介绍了TGEA中材质的使用.顺便在此感谢一下carl帮我画的插图,不愧是程序中的美工,美工中的程序啊..哈哈..
1. 基本概念
1.1. 材质对象简介
材质是TGEA新引入的一个脚本对象。它的含义不同于DX中的材质(只包括光反射属性),它更像3DS max中的材质,包括一个表面渲染的各种属性。
材质指定了模型的表面的渲染效果,它分为两种Material与CustomMaterial。分别对应TGEA对shader两种支持模式:
l 引擎生成(Procedural Shader Generation),可以使用Material设置好各种渲染特性,后引擎会自动生成相应的shader文件(位于example/shaders/ procedural目录下)。
l 用户自行开发(Specifying Hand Written Shaders),可以使用CustomMaterials对象,同时指定渲染这个材质所要使用的ShaderData,再在ShaderData中指定相应的shader(hlsl文件)。后续会一一介绍.
1.2. mapTo
首先来看一下材质的一个重要属性mapTo。这个属性指定了模型与材质的映射关系。
TGEA是完全基于可编程管线的渲染引擎,即使用shader(.hlsl)。而mapto与将材质与要使用这个shader渲染的模型联系起来。它们的关系如下图:
图1 一个模型可以由多个材质对象来共同渲染
左边为shader,右边为模型及这个模型的纹理文件。材质居中,它将shader与纹理联系起来。这样引擎遇到使用这张纹理的模型的面时,就会使用这个shader进行渲染。
这样讲或许很不清晰,我们来看具体的实例:
运行tge1.0.3(接下来的TGEA均指TGEA1.0.3)附带的范例“DEMO”,以其中的textur animation为例。这个例子是一个立方体,有6个面,相应的模型与纹理文件位于目录example\demo\data\shapes\test。
然后打开同目录下的materials.cs,所有模型的材质定义都在这个文件中,此文件中有如下代码:
new Material(One)
{
mapTo = one;
baseTex[0] = "one";
emissive[0] = true;
glow[0] = true;
};
第一个属性为mapto,它将材质映射到纹理上。第一行的“mapTo = one;”指的是one.jpg这个纹理文件。使用ShowTool Pro打开newbox.dts,如图2,可以看到one.jpg就是这个模型的一张纹理。因此引擎便使用这个材质来渲染使用了此张纹理的模型的面。
图2 “one”
Mapto要特别注意的是它的作用只是将材质与模型的纹理对应起来,它与渲染时使用的纹理无关。具体的看如下例子。在ShowTool Pro里可以发现,模型newbox的纹理“1”的对面是纹理“2”(图3)
图3 ShowTool Pro中1的对面是2,1与2之间是4和6.
可是在DEMO程序中,可以看见1的对面是6,即2和6的位置对调了。。。
图4 demo中,1的对面是6,1与6之间是4和2
很有趣,现在让我们来详细看看materials.cs中的相应代码:
new CustomMaterial(Two)
{
mapTo = six;
version = 2.0;
shader = Waves;
texture[0] = "two";
texture[2] = "~/data/interiors/test/metalcrate_bump";
specular[0] = "1.0 1.0 1.0 1.0";
specularPower[0] = 16;
fallback = TwoFallback;
};
由mapTo = six;可知,这个材质是应用到模型的six.jpg这张纹理。
但是texture[0] = "two";这句代码却指定了在渲染six.jpg对应的模型的面时,应该使用two.jpg这张纹理进行渲染!
所以要注意mapto只和纹理映射相关,与渲染无关.渲染这个面使用的纹理是材质中的其他属性指定的。
大致了解了材质以及材质的mapTo属性后,接下来具体看看Material与CustomMaterial。