

大家好,我是vghost,我们来讲解cs起源与csgo的模型材质VMT常用参数
在此说明,本系列教程仅适用于单机、线下模式,不支持联网、线上的游戏模式
首先需要准备的是一个起源游戏,以及一个你喜欢的CS起源武器模型以及csgo游戏,以及一个你喜欢的csgo的武器模型
由于需要做对照实验,所以我在这里选用了CS起源与CSGO都一样的模型作为对照组
cs起源和csgo游戏只需能跟人机游玩即可
首先,我们先来讲什么是VMT,VMT是什么
官方的解释是,VMT是source引擎的一种文本文件,其限制在二维层面,它包含了source引擎在视觉、听觉以及物理上模拟出制作者想要的所有信息
而非官方的解释也就是我来说,VMT文件是一种索引文件,它索引的对象是后缀为vtf的材质文件,这vtf文件可以简单理解为模型的贴图

而VMT文件内的参数则是让游戏中的模型更加生动且真实
就像上一期教程里所讲的带有dir字样的vpk文件,它是所有pak.vpk文件的索引,而VMT文件则是索引所有vtf文件
无论是CS起源还是CSGO,他们的VMT参数完全一致,或许有列外,但基本上大同小异
虽说他们的参数一致,但是游戏中的效果却不尽相同,这就是本期教程的目的
明白了这一点之后,我们打开你所喜欢的武器模型压缩包,打开里面的materials,models,weapons,打开v_models,再打开里面的文件夹,这就是武器模型的材质文件夹
这个文件夹的名称是制作者来命名的,所以什么名字都有,如果你已经将武器模型覆盖进游戏目录中,那么打开游戏目录中的这个文件夹可以直接编辑vmt文件

打开这个文件夹后,可以看到有许多vmt以及vtf文件
有些武器可能只有一个vmt文件,那是因为这个武器没有把材质分开,都合并在了同一张贴图里,对应了整个武器模型
而这是将武器模型的材质某一部分分开,分别对应不同的贴图,而不同的贴图需要有不同的vmt文件进行索引,所以你可以看到有许多的vmt文件
这是属于模型的范畴,不是本期教程的内容,我们在其他的教程中进行详细解释
这里我们用notepad来打开这个vmt文件,映入眼帘的是一堆英文单词
我们可以看到,这些个英文中是有两个双引号的,第一个双引号括住了前面的参数,而第二个双引号括住了后面的语法
不同的参数对应了不同的语法
我们来一个一个讲解参数和语法,我们先用CS起源来测试,到后面我们再说CSGO的效果
首先,第一行
vertexlitgeneric这是着色器类型,所有的vmt文件都有这个参数,它负责告诉source引擎这个VMT索引下的材质该用什么着色器去着色

武器模型一般为vertexlitgeneric,翻译过来是顶点着色
我们可以看到,这个vertexlitgeneric下有大括号把所有的参数都括了起来,这个大括号必不可少
我们看到basetexture,这个的意思是基础贴图,这个是最为重要的一项参数,什么都可以没有但就是不能没有它

我们看到后面的语法,它是一个路径,这个路径指的就是武器模型的贴图位置,也就是与vmt文件一起的vtf贴图文件
好的我们看下一项,bumpmap,又可以写为normalmaptexture,这是法线贴图的意思,法线贴图又名凹凸贴图

顾名思义,这个贴图可以让模型呈现出凹凸的效果,又或者可以理解为二维营造出假的三维效果
语法跟上面的basetexture一致,同样是贴图路径
好的,下面是重点,我们看到下面的phong参数
phong p h o n g 这个是冯氏着色法,又称冯氏光照,它是source引擎里最为常用的一项参数
如果你喜欢武器模型,那么冯氏着色法参数将会是你常常打交道的对象
有些人说这就是普通的漫反射参数,这是不准确的,VMT里的所有参数都可以当作是漫反射
我们看到它的语法,boolean,翻译过来叫布尔值,因为这个布尔值就只有两个,一个0,代表关闭和一个1,代表开启
所以,我直接将它理解为一个开关,1就是开,0就是关,在这里,我们选择了1,也就是开启phong冯氏着色法
它的遮罩为法线贴图的alpha图层,这里我们待会讲解
下一个,phongboost,定义为冯氏光照的亮度,跟photoshop里的亮度调节是一样的

我们可以看到,当这项参数的数值变小时,模型上的光照亮度并不高,而数值变大时,光照的亮度就提升了
我们看到它的语法,float,浮点数,对此我也不是特别清楚这个语法该如何使用,但我是直接将它作为整数来对待,数值写得越高,效果就越大
好的,我们看到下面的phongtint,此项参数是指phong的反射光色调,也就是将武器模型上的白光更改为其他颜色的光

我们看到它的语法,RGBmatrix,翻译过来叫RGB矩阵,意思为RGB三个通道的强度
我们看到它后面的中括号,里面有三个数字,.9 .9 1,我们一般将小数点前面的零省略,也就是第一个数字为0.9第二个数字为0.9第三个数字为1
那么RGB矩阵的意思是,第一个数字为RGB的R,第二个数字为RGB的G,第三个数字为RGB的B,也就是RGB的红、绿、蓝三个通道所对应的数值
明白了这一点之后,我们如何调出自己想要的颜色呢?在此我教给大家一个十分简单且实用的技巧
首先,打开photoshop,看到调色盘的位置,我们可以看到,有RGB三条颜色,三条颜色分别对应三个数值
我们可以看到,0为最小的颜色,而255为最大的颜色,那么在这条参数的语法中,RGB矩阵的最大值为1,那么我们可以理解为255等于1
如果我们想要调成红色,那么将RGB中的R通道调成255也就等于参数1 0 0
如果我们想要调成蓝色,那么将RGB中的G通道与B通道调成255也就等于参数0 1 1
如果我们想要调成紫色,那么将RGB中的R通道调在中间,G通道为0,B通道为255也就等于参数0.5 0 1
那么大家听明白了嘛,好的,我们继续

下面的phongalbedotint,意思是开启或关闭使用basetexture来作为phong的反射颜色
这项参数与上一项参数phongtint是一样的,只不过使用的是basetexture来影响反射颜色,也就是,如果你的basetexture带有蓝色,那么反射的色调就为蓝色
不过需要注意的是,如果此项参数与phongtint共存,那么只有phongtint生效
它的语法是boolean,也就是开启或关闭
我们看到phongalbedoboost,这项参数的意思是增强反射颜色的亮度,与phongboost是同样的意思
用来增强上面的phongtint和phongalbedotint颜色的亮度
然后,我们来讲phongexponent,这项参数是指冯氏光照的密度
这项参数与phongboost是有互相搭配的关系,一项是亮度,一项是密度
它的语法是integer,意思是整数,所以只要想着数值越大效果越明显即可

我们看到武器的消音器部分,在phongboost数值不变的情况下,当phongexponent数值越大,打到消音器上的光线就越密,反之数值越小,光线则越散

如果我们用球体来表示,则可以看出,数值越大,光点就小,光打的就密集,数值越小,光点就大,光线打的就生疏
所以,当我们参考官方给的这张图片时,便可以根据这张图片去调配出自己想要的光线效果
好的我们看下一项phongexponenttexture,这又是一项关于texture的参数,我们一般将这项参数称为高光贴图参数,而高光贴图一般只有黑白灰三种颜色
我们从英文单词中看出,这是与上一项十分类似的参数,这项参数的作用跟上一项的phongexponent是一样的
只不过把语法换成了贴图,也就是使用贴图控制冯氏光照的密度,而不是像上一项phongexponent使用数值去控制
也就是说,如果这项参数的贴图中哪里有白色、有多少白色,那么相应的打到模型上的光的效果便会跟贴图上的一致
通俗的讲就是用贴图代替数值去工作,相较于上一项phongexponent,我们一些制作者并不是特别喜欢这一项参数,因为修改贴图不如修改数值来的快和来的简单
虽说phongexponenttexture对于模型的冯氏光照密度有着较为精确的掌控,但这项参数也只能是辅助的作用,有,自然就最好,不过没有,也不用去纠结
值得注意的是,如果启用此项参数的同时启用phongexponent,那么只有phongexponent生效

好的,我们来讲解phong参数中比较关键的一个参数,phongfresnelranges,翻译过来叫冯-菲涅尔参数
如果你在启用phong冯氏着色法时,没有启用这一项phongfresnelranges参数,那么所有的冯氏参数都将失效
我们看它的语法,matrix,与上面的RGBmatrix很像,同样为矩阵语法但使用的方式却完全不同
我们看游戏中的列子来理解,首先我们将第一个数值调整为100,其余数值调整为0
我们可以看到,当我们面对着光源时,模型并不反光,而当我们背对着光源时,模型就反光了

好的,我们将第一个数值调整为0,第二个数值也是0,第三个数值调整为100
此时我们发现,当我们面对着光源时,模型反光了,而当我们背对着光源时,模型不反光了,与第一次的测试背道而驰

好的,我们将前后两个数值调整为0,将中间的数值调整为100,此时我们发现,无论是背对着光源还是面对着光源,模型都有反光
我们仔细观察模型发现,当我们背对着光源时,第一次测试时打在模型上的光点与第三次测试时打在模型上的光点有着明显的变化
第一次的光点比第三次的大

那么根据上面的测试我们可以得知,phongfresnelranges是可以调整由不同的角度所带来的光线效果
并且,我们发现中间的数值与两边的数值是不同的,中间的数值似乎是两边的数值的中和,既没有只往一边打光,也没有打上非常强烈的光线
那么我们可以简单理解为,phongfresnelranges参数的第一项是只修改背对着光源时的光线亮度
第二项为面对以及背对光源时的光线亮度
第三项为面对光源时的光线亮度
在第一人称武器模型的情况下,我们可以这样来理解phongfresnelranges参数
而当处于第三人称时或者是其他的情况时,phongfresnelranges参数将会更加复杂,为了让各位理解并消化,在此我就不深入讲解,有兴趣的朋友可以上官网查看官方解释

好的我们看到basemapalphaphongmask参数,这项参数的意思是将basetexture的alpha通道作为phong遮罩
前面讲了,phong原始遮罩为法线贴图的alpha图层,而此项参数是更换了法线贴图的alpha图层为basetexture的alpha图层
遮罩的意思就是告诉phong参数哪些地方需要着色,哪些地方不需要着色
如果alpha通道不存在,那么遮罩就为全白色,此时phong参数将会在整个贴图上进行着色
好的我们看到basemapluminancephongmask,此项参数与上一项参数是类似的,但这项参数是以basetexture的亮度作为phong遮罩
好的,我们看到下面的phongdisablehalflambert参数,此项参数与后面的halflambert参数有关系,所以我们到后面再说
好的,至此phong这一大类常用参数就讲解完了,我们接下来讲解下一大类
首先我们先关闭phong参数,这样才不会影响其他参数的测试
我们看到下面的envmap,全名是envrionmentmap,此项参数是环境贴图参数,如果你开启此项参数,那么就等于开启了环境反射
也就是在模型上放一面镜子,反射周围的环境

我们看到它的语法,是texture的语法,也就是说你可以设置一张贴图,让这面镜子去反射这张贴图
但是,我们一般将这项参数的语法设置为env_cubemap,这个语法的意思是在地图最近的区域内获取一张环境贴图
所以,如果你写上了这项语法,那么你的这面镜子会不断变化,我们看模型上反射的环境,可以清楚看到后面的楼房
此时我们换个位置,那么环境贴图便会改变
好的我们看到下面的normalmapalphaenvmapmask参数,此项参数的意思是以法线贴图alpha图层作为环境反射遮罩

与phong参数中的basemapalphaphongmask参数是一致的,告诉source引擎哪里需要环境反射哪里不需要
一般我们都会开启这项参数,因为不开启的话那么模型就真的成了一面镜子了,因为envmap的原始遮罩为一片白色,一片白色的意思就是整个模型或者说整张贴图都有环境反射
好的我们看到envmaptint,此项参数又是与phongtint是类似的
有些人还是将这两个参数弄混淆,在此我说明一下
phongtint是反射光线,而envmaptint是反射环境,也就是说,如果没有光源的地方,phongtint是不会生效的,而envmaptint只要你周围有环境,那么就一定会生效

同样,语法也是跟phongtint一致,在photoshop中看好你要设置的颜色再转换到vmt即可
好的我们看到envmapmask,此项参数的意思与phong中的phongexponenttexture参数是一致的,利用贴图去定义模型的环境反射强度
此项参数并不是特别常用,但还是需要说明一下
好的,我们看到envmapcontrast和envmapsaturation,这两项参数的意思,一个是调节环境反射的对比度,一个是调节环境反射的饱和度

与photoshop里的调节对比度和饱和度是一模一样的,我们看到它的语法,在这里我写的是integer,也就是整数,越大数值效果越明显
但官方的是语法是normal,意思是取0到1之间的小数当作百分比来使用,但经过测试,我觉得语法直接写成integer会让大家更容易理解
因为不止可以取0到1之间的数,数值取得越大效果就越明显
需要注意的是,这两项参数与phong参数有冲突,如果你启用phong参数,那么这两项参数将会失效

好的,到了最后也是最难的envmap参数,我们看到下面envmapfresnel和envmapfresnelminmaxexp这两个参数
有没有一种似曾相识的感觉?没错,与上面的phongfresnelranges有着一样的意思,并且还有着不可分割的联系
首先,这两项参数必须要在phonogfresnelranges启用时才会生效,否则无效
我们看到envmapfresnel,这项参数既有开启环境反射菲涅尔的意思,也有调节环境反射菲涅尔强度的意思

当我们启用这项参数并且把数值调高,那么环境反射菲涅尔的效果就明显
也可以直接当作是调节环境反射的强度,因为不像phong参数那样有单独的phongboost和phongexponent去调节强度
它的语法是float,也就可以当作是数值越高效果越明显

我们看到envmapfresnelminmaxexp参数,这项参数我无论怎么测试都不明白到底是如何工作的
有人说就跟phongfresnelranges一模一样,但经过我的测试,这项参数跟没用的参数似的,甚至envmapfresnel与phongfresnelranges联系还要紧密
那么在此我们先跳过envmapfresnelminmaxexp参数,讲讲envmapfresnel与phongfresnelranges参数的关系
首先,envmapfresnel并不像phongfresnelranges参数那样可以调节模型菲涅尔的效果
envmapfresnel只能调节环境反射菲涅尔的强度
那么如何调节环境反射菲涅尔的效果呢?其实这是一个很bug的存在
如果你开启了envmapfresnel参数,那么这项参数就与phongfresnelranges产生了绑定
也就是说,只能从phongfresnelranges参数去调节环境反射的菲涅尔效果
那么如果是这样的话,环境反射菲涅尔效果将会与phong菲涅尔效果产生冲突
也就是说,如果你想面对着光源时有phong的反射而没有环境反射,背对着光源时有环境反射没有phong反射,那么是做不到的
也许那项envmapfresnelminmaxexp参数正是解决这种问题的办法,但是我目前并没有找到这项参数的用武之地
好的,至此,我们的envmap常用参数就讲解完了,我们接着继续

好的我们看到下面的rimlight,这项参数是指模型的轮廓光,之前我们学了反射光phong,还有envmap环境光,现在我们还要学习一个轮廓光
这个是三种光里最为简单的一种,因为这种光我们不能改变太多,比如说这种光的颜色是改变不了的
顾名思义,轮廓光也就是模型轮廓的光,不是在模型正面,也不是在模型背面,是在模型轮廓
它的语法是boolean,也就是开启或关闭的意思,值得注意的是,轮廓光必须要在phong开启的情况下才能使用
我们看到下面这两个参数,相信我不用讲解大家看名字就能猜得出来这是什么参数了
没错,跟上面的phong里的phongboost和phongexponent是同样的意思,在这里我就略过了
好的,我们看到rimmask,这项参数是指以phongexponenttexture作为轮廓光的遮罩,如果phongexponenttexture不存在,那么此项失效
这项参数不常用,大家知道就好
好的,我们所有的必要常用参数就讲解完毕了,接下来讲解一些不怎么必要但是也经常见到的参数
首先,我们看到这个halflambert参数,翻译过来叫做半兰伯特参数,这项参数基本上每个vmt文件都能见到
它的语法是boolean,也就是开启或关闭
这项参数其实效果并不明显,你开了可能跟没开是差不多,
这项参数主要是让模型拥有更多的亮度变化,但经过测试,这种效果微乎其微
还记得上面所提到的phongdisablehalflambert参数嘛?
当我们开启halflambert参数时,只要你在vmt文件上写了参数,那么,几乎所有的参数都会受到halflambert的影响
那么phongdisablehalflambert参数的意思就是在phong参数上禁用halflambert效果
这项参数大家有个印象就好

好的,我们看到selfillum参数和translucent参数,这两项参数分别是让贴图自发光和让贴图透明的参数
他们都是使用基础贴图basetexture的alpha通道作为遮罩去实现自发光和透明
不同的是,在alpha通道里,越白的地方自发光就越亮,越黑的地方自发光就越暗,而透明就刚好相反,越白的地方越透明,越黑的地方越不透明
好的,至此我们所有的vmt常用参数就讲解完毕了
还记得在开始的时候说,到后面再来看csgo的效果嘛
首先,CS起源与CSGO的区别还是很大的

尤其是在游戏中的渲染方面,而vmt参数恰好就在这游戏的渲染层面
所以我们可以看到,同一条参数,在CS起源与CSGO中是有着不一样的效果
虽然说有着种种的区别,但是,vmt参数的使用方法是没有任何区别的
所以,你可以学会了使用参数后去到CSGO里慢慢尝试并测试出自己想要的效果
在此我就不一一测试参数在CSGO中的效果了
好的,那么本期的教程内容就接近尾声了,再次说明一下,本教程只是我个人的一些经验和理解,不代表绝对正确也不代表绝对错误
如果你在其他的教程中学习了知识并与本期教程有着不同的出入,那么恕我无法概括全面,敬请包含
好的,本期的教程内容到此结束,祝大家学有所成,如果你喜欢本期视频,请不要忘记分享给其他有需要的人
那么我们下期视频再见