转自66RPG:NeoAxis教程 第三篇

来源:互联网 发布:php开源源码 编辑:程序博客网 时间:2024/06/06 11:42

http://www.360doc.com/content/10/1003/23/3711385_58244470.shtml



全国哀悼日,游戏上不去,于是死心塌地的来更新教程鸟~~~
前两篇我们用Map Editor制作了一个小型的Demo,其实只是为了大家对NeoAxis有个初步的了解而设的
今天将讲述更专业的一些领域的知识

此堂课程需要用到的编辑器是Resource Editor


首先我们将讲解NeoAxis的材质编辑器
先解释一下何为材质
会做3dsMax或者Maya或者对3D有点了解的朋友基本应该很熟悉这个东西了,而一直在二维世界活动的朋友们可能并不清楚材质的作用和意义
对于一个3D的模型,一共有3部分组成:一个是Mesh文件,他是对三维物体形状、顶点、边界、面等信息的描述文件。另一个是贴图纹理,也就是我们一般能用工具从3D游戏中提取出来的一堆无法使用的图片。这些图片会根据Mesh中的UV信息被贴到模型上。
但实际上,在Mesh和纹理图片之间,还存在了一个叫做材质(Material)的东西,他被用来表现物体表面的质地。比如布料的表面有坑坑洼洼,金属表面就要有光泽,镜子表面需要反射。这些东西光在图片上是表现不出来的,所以材质技术才会发展起来。
下面我们比较一下不同的材质产生的不同的效果:

没有任何编辑的材质,上面只有一张图片

稍做修改,加上反射光和Normal Map后的效果

实际上,材质编辑在次世代游戏制作中有着非常重要的地位。想要取得更好的画面效果,就必须在材质上花更多的力气

一般来说,材质不需要用户自己创建。使用导出工具从3dsMax或Maya中导出模型后,材质文件也会被一起导出。但是,你依然可以自己新建材质资源。
我们在Resource Editor左方挑一个目录位置,右键新建资源,选择Material,然后会看到一个选择窗口

我们需要用到的是第一项:ShaderBaseMaerial
顺便说一下,FPSWeaponMaterial干啥的我目前还不清楚,VegtationMaterial是植物用的材质,这类材质会自动左右晃动模拟 植物摇摆的效果。SimpleExampleMaterial是一种简单材质,效果就是只贴一张图片,完全不做任何效果的改动
起完名字,材质就建好了,双击进入编辑模式
我们看一下右方的属性,这些就是我们可以编辑的东西了,下面我来逐项解释

AllowFog 允许材质接受雾
AlphaRejectFunction AlphaRejectValue Alpha 计算方法,根据这两项的值来决定将什么范围的Alpha作为阀值
AlphaToCoverage 当需要使用较精确的Alpha计算时打开此项
Blending 半透明类型。Opaque为不透明,AlphaAdd为根据颜色值来决定透明度,AlphaBlend为根据Alpha值来决定透明度。一般图片有半透明色的时候需要用AlphaBlend
Culling 裁剪。一般这是显卡提供的功能,打开后多边形就会只描画一面,关闭就描画双面。一般都会打开提升效率,除非你希望一个面是能从两边都能被看见
DepthTest 深度测试,比较复杂的概念,不解释,有兴趣的可以自己百度
DepthWrite 深度写入,比较复杂的概念,不解释,有兴趣的可以自己百度
FadingByDistanceRange 设置此项的值,那么在超过设置距离时系统会自动关闭复杂材质,提升系统效率
Lighting 允许受光,关闭此项后下面一大堆和受光有关的属性也就无效了
ReceiveShadows 允许接收阴影
UseNormals 允许使用Normal Map

上面是一些全局概念,不多说了
我们来给材质增加一张图
我在Diffuse1Map中填了Maps\TankDemo\Resources\Terrain\Grass_Diffuse.dds

DiffuseMap即是表层的纹理贴图,如你看到的,一张材质上可以同时有4张纹理贴图,他们会被叠加的计算到一起
DiffuseColor表示了散射光的颜色,你可以理解为这个材质吸收什么光。填全黑时表示他吸收了所有的颜色光,所以光线照射到上面时他不会表现出任何颜色(因为光都被吸收了),填全白时表示他不吸收任何颜色,所以所有光线全被反射到你的眼睛里了
DiffusePower表示光的强度


散射光为红色时

散射光为黄色时

接着是Emission
我们将其称为自发光。但自发光的意思并不是意味着他会像灯泡一样的发亮
在3D游戏中,物体需要被Light,即灯光照亮才能被看到。如果一盏灯都没有,那么画面将一片漆黑,什么都看不到
Emission解决了此问题。即物体本身带着一定的亮度,使得即使在没有灯光照射的情况下,物体依然能够被看到,就好象自己会发光一样(但是这个光不会照到别人)

关闭环境光,我们看到材质变得暗淡无光

设置了一个黄色的EmissionColor,模型变亮了(但不是被照亮的)
一般我们都会给模型一个很低的自发光色,使得模型不会显得很暗

Height模块,是关于NormalMap的内容,NormalMap的概念我们在第一章解释过了,就不罗嗦了
直接在NormalMap里填上Maps\TankDemo\Resources\Terrain\Grass_Normal.dds,看看效果

是不是有了草皮参差不平的效果?

Reflection CubeMap是处理反光的,我们之后再讲

Specular模块是反射光,即金属光泽

虽然草皮上打这个显得很假,为了展示效果,我还是打了一个白色的SpecularColor

随便编辑的材质完成了,放到模型上试试效果


可能以上内容初级用户还很难用到,不过以后进阶的话是一定会需要知道的知识



接着来看比较重要的界面编辑器(GUI)
依然在Resource Editor中新建,这次选择UI Model
这时会提示选择一个基础控件类型
我们展开BaseTemplates来看有哪些基础控件
Button 按钮
CheckBox 也就是经常能看到的能打勾的框
ComboBox 下拉框
Control 基础平面
EditBox 输入框
ListBox 列表框
ScrollBar 滚动条
TabControl 就是那种有多个页可以切换的盒子
TextBox 文字,注意是显示用的不能用作输入
VideoBox 视频控件
注意我们此时选择的是基类控件,一般来说就选Control吧
起完名字确定,双击进入编辑模式


在右方有一个ControlHirearchy,这是一个层级结构

每个控件都会有自己的父控件,所以要新建控件,只要在其父控件上右键,增加控件即可

随便加了几个控件

至于怎么放图片,选中控件在右边的属性中放置即可,比较简单,大家自己尝试
顺便说明一个问题,上次见到有人对物件的选中有疑问,这里解答一下,NeoAxis都是要勾住名字左边的方框才算选中,光用鼠标点中名字是不算选中的

至于怎么把界面显示出来,就要用到代码咯,是不是脑子烧糊了?呵呵
我先随便讲一下代码里怎么显示GUI
打开工程(..\Game\Src\NonCommercialLicense.sln)
打开WindowAppExampleHUD.cs,修改WindowsAppExampleHUD类的OnAttach函数

  1. protected override void OnAttach()
  2. {
  3.         base.OnAttach();

  4.         EControl window = ControlDeclarationManager.Instance.CreateControl("Gui\\WindowsAppExampleHUD.gui" );
  5.         Controls.Add( window );

  6.         EControl window2 = ControlDeclarationManager.Instance.CreateControl(
  7.                 "Types\\Test\\testObject.gui");
  8.         Controls.Add(window2);

  9.         ( (EButton)window.Controls[ "Close" ] ).Click += CloseButton_Click;
  10. }
复制代码
注意路径要填你新建的GUI资源的位置
然后编译,注意,编译时最好把地图编辑器和资源编辑器关掉,不然可能编不过
运行WindowsAppExample这个工程看看效果
点击Show UI看看GUI界面


为第一个按钮添加一个事件的响应
重新修改函数如下
  1. public class WindowsAppExampleHUD : EControl
  2. {
  3.         EControl window2 = null;

  4.         public WindowsAppExampleHUD()
  5.         {
  6.         }

  7.         protected override void OnAttach()
  8.         {
  9.                 base.OnAttach();

  10.                 EControl window = ControlDeclarationManager.Instance.CreateControl("Gui\\WindowsAppExampleHUD.gui" );
  11.                 Controls.Add( window );

  12.                 window2 = ControlDeclarationManager.Instance.CreateControl("Types\\Test\\testObject.gui");
  13.                 Controls.Add(window2);

  14.                 (window2.Controls["Button01"] as EButton).Click += buttonClick;

  15.                 ( (EButton)window.Controls[ "Close" ] ).Click += CloseButton_Click;
  16.         }

  17.         void CloseButton_Click( EButton sender )
  18.         {
  19.                 SetShouldDetach();
  20.         }

  21.         protected void buttonClick(object sender)
  22.         {
  23.                 if (window2 != null)
  24.                 { 
  25.                         if (window2.Controls["Button01"].Text == "ButtonClick OK")
  26.                                 window2.Controls["Button01"].Text = "Button01";
  27.                         else
  28.                                 window2.Controls["Button01"].Text = "ButtonClick OK";
  29.                 }
  30.         }
  31. }
复制代码
运行,点击第一个按钮看看效果

说的比较粗,代码还是比较容易理解的

0 0