模型材质

From Valve Developer Community
< Zh
Jump to: navigation, search
English (en)日本語 (ja)한국어 (ko)Русский (ru)中文 (zh)Translate (Translate)

本简体中文页面由 Gloria 汉化。

介绍

为起源引擎游戏制作模型——不论是实体模型、角色模型或是动作模型(viewmodel)等等——都需要至少3个基本构件:.MDL(en)文件,.VMT(en)文件以及VTF(en)文件。

然而,单纯地认为MDL文件是“模型网格”,VTF文件是“皮肤”,VMT文件是“物理”并不够严谨。在制作的每个阶段,你的模型都包含了至少两个独立的文件,但它们之间是有交叉引用的。编译的各个阶段都需要来自其它文件的数据。因此整个流程必须严格按照顺序进行,文件名和路径也是有严格要求的。

这些文件的创建过程大致可以分为两步:

  1. 第一步,创建基础纹理并映射到模型网格上,生成出两个“临时”文件:.SMD(en)文件与.TGA(en)文件。
  2. 第二步,使用.SMD文件与.TGA文件,编译MDL、VMT、VTF文件到起源游戏根目录各自的路径下。

使用XSI将纹理映射到.SMD模型中

  1. 选中建模完成的网格
  2. 切换到XSI的渲染模式(位于左边栏的顶部)
  3. 在 Render->Get-Material 选择 Blinn
  4. 在 Render->Get-Texture 选择 Image 以打开图片纹理窗口:
  5. 在 Image-Texture tab->Image 点击 "New" 以查找并导入你的TGA(en)纹理文件
  6. 在 Image-Texture tab->Texture Projection 点击 "New" 并选择 Unique UVs (polymesh)(关闭图片窗口)
  7. 按下“Alt+7”打开XSI Texture Editor窗口
  • 如果你的纹理映射搞砸了想从头开始:
1. 按下 "8" 打开 Scene Explorer,接着按如下方法进入到 Texture Projection:
-> Cube (或是你的基础物体)
--> Polygon Mesh
---> Clusters
----> Texture_Coordinates_Auto
-----> Texture Projection (Explicit UVWs) 
2. 现在左键点击 "Texture Projection (Explicit UVWs)" 进行选中,然后按下 "Delete" 键来删除。
3. 检查 3D 视图(在 'textured' 模式下)以确保没有选错。否则,按下“Ctrl+Z”撤销操作并重来一遍。

适时地预览

  • 带纹理模型的效果应该直接在起源引擎中进行评估,在你开始进一步完善材质、导出vtf、创建vmt、创建mdl并从引擎中观察效果之前。只有先在引擎中看到了你的模型,才能开始完善你的纹理、阴影参数。

棋盘模板纹理

  • 使用棋盘纹理(checkerboard texture)非常适合最开始的UV制作;它能让你快速发现哪里有畸变、条纹,或是其它需要修复的地方。另外,使用棋盘纹理让你得以衡量模型不同的位置应该用多大的图片像素密度(Texel Density, TD),当你在定义UV时,部分区域例如脸部可能需要更高的密度,但总的来说还是要尽量让模型上的图片像素密度更加均匀和一致。XSI中缺省的 noicon.pic 文件是个不错的选择,或者可以使用SDK中的这个文件, Checkerboard Starter Texture (右键另存为...)。

纹理的尺寸?

  • 尽早地导出.VTF文件并在引擎中进行预览。在控制台输 mat_showmiplevels 命令,在游戏中查看模型的贴图细化级别(mipmap level)。尽管直觉上来说越大越好,但事实上并不一定,贴图细化会强制缩小你的纹理尺寸,导致出现模糊化问题。

多个纹理

  • 尽量只使用一种基础纹理,除非有材质上的其它需要。模型上有多个纹理会极大增加渲染时间。如果有在一个模型上创建多个纹理的需要,你必须先先选中一组多边形,创建一个簇(cluster),再将材质与图片应用到簇上。确保首选项设置成了 "reload externally modified images on focus"。这样当你按下Alt+Tab从其它程序——例如Photoshop——切换回XSI时,它将会自动重新加载纹理。

编译.VTF文件

任何纹理文件在映射到模型之前(当你从3D软件导出.SMD文件之前),都必须从TGA(en)转换为VTF(en)文件才能在起源引擎中使用。VTF文件名必须与应用到.SMD模型上的TGA文件名一致(例如:“我的纹理.TGA” 到 “我的纹理.CTF”),并且VTF文件必须放置在 $游戏根目录$/materials/models 路径下

  • SourceSDK/bin 包含了 Vtex(en).exe,一个用于编译VTF文件的程序。最简单的使用方式是在桌面上创建 vtex.exe 的快捷方式,然后拖动TGA文件到快捷方式上。它将在materials文件夹中创建一个与你的TGA文件名相同的VTF文件。当使用拖动方式在Vtex中打开一个tga文件时,还会在.TGA文件的相同路径下生成一个 .TXT 文件。在这个TXT文件中你可以发布用于Vtex的命令以更改你的压缩。
Note.png注意:为了快速创建材质,可以尝试在Vtex快捷方式属性中添加“-shader VertexLitGeneric”选项。该选项适用于任何着色类型(shadertype)。完成以后,再向这个快捷方式拖动运行纹理文件时,不但可以正常创建 .VTF 文件,还将额外创建配置好着色器与基础纹理属性的 .VMT 文件
  • 作者Cannonfodder开发的 StudioCompiler(en) 提供了Vtex程序的一个更为友好的图形化用户界面(以及 Studiomdl)。该软件可以将 TGA、SMD 文件编译成 VTF、VMT以及 MDL 文件,或是从 VTF、VMT、MDL 反编译出 TGA、SMD 文件。

编译 .VMT 文件

起源引擎的每个纹理都是由对应的 .VMT(en) 文件定义的。它指定了光照模型、基础纹理(VTF),根据需要还可以指定其它额外的通道例如:镜面反射、自发光、法线贴图、透明度、半透明效果,以及代理着色器(proxy shader)。

对于模型来说,你的 .VMT 文件必须手动填写(使用记事本等软件),并放置在$游戏根目录$/materials/models下,让你的模型文件可以找到纹理。文件中指定的“$basetexture”属性(即你的 .VTF 文件)必须与 VMT 文件放在相同的文件夹中。

Tip.png提示:使用QC指令 $cdmaterials(en) 可以指定成其它的文件夹
Warning.png警告:一切用于模型的纹理必须使用 VertexLitGeneric(en) 类型。如果使用 LightmappedGeneric(en) 或是 UnlitGeneric(en) 类型作为模型材质将无法正常显示(en)

以下是来自 HL2 的一个 VMT 文件示例:

"VertexLitGeneric(en)"
{
     "$basetexture(en)" "Models/Combine_soldier/Combine_elite"
     "$bumpmap(en)" "models/combine_soldier/combine_elite_normal"
     "$envmap(en)" "env_cubemap"
     "$normalmapalphaenvmapmask(en)" 1
     "$envmapcontrast(en)" 1
     "$model(en)" 1
     "$selfillum(en)" 1
}

示例是一个用于多边形模型的贴图,使用了 VertexLitGeneric(en) 着色器类型。

$basetexture(en) 属性,或者叫漫反射贴图(diffusemap),指定为 "Models/Combine_soldier/Combine_elite"

$bumpmap(en) 属性,或者叫法线贴图是从 "models/combine_soldier/combine_elite_normal" 导入的

$envmap(en) 属性,或者叫环境贴图,指定为 "env_cubemap",代表放置在关卡中的 cubemap 实体;它能够反射出周围的世界环境——如果你的 cubemap 实体放置正确的话。如果想的话,你也可以把该属性指定成自定义的环境贴图。

接下来一行,"$normalmapalphaenvmapmask" 1 诉渲染器当前纹理有一个反光区域的遮罩层,这样只有模型的部分区域能够反射出环境贴图。这个示例中是定义在法线贴图的Alpha通道属性的,反光遮罩层还可以定义在这里——基础贴图的Alpha通道 "$basealphaenvmapmask 1" 中,或是使用独立的遮罩贴图文件 "$envmapmask" "models/modelname/mymask"

"$envmapcontrast" 1 命令表示环境贴图的亮度为1倍亮度;可以用于产生更亮的高光与更暗的阴影。

任何模型都必须有这一行指令 "$model" 1 ,它将告诉渲染器这个贴图是用于 Studiomdl.exe 编译出的模型的。

最后一行, "$selfillum" 1 ,告诉渲染器 $basetexture 基础贴图中的Alpha通道包含了自发光区域;这些Alpha通道指定的区域将在模型中表现为发光的区域。

Alpha通道

为了让带Alpha通道的材质可以正常使用,必须在VMT文件中加上一行命令 "$translucent(en)" 1 。 某些情况下这会导致模型渲染错误 (例如,凸面1原本在凸面2的背后,但却将凸面2遮挡住了 => 渲染错误)。如果出现了这种情况,使用 "$alphatest(en)" 1 命令代替 "$translucent" 1 命令应该可以够修复。

代理着色器

起源引擎材质系统有一个强大的组件,就是代理着色器系统(Proxy shader system)(en)。SDK中包含的着色器列表中列出了有哪些可用的代理着色器。在材质文档中可以找到关于它们的使用说明。