现在的位置: 首页 > 综合 > 正文

MAX SDK之对象处理(三)-(3.4 材质对象)

2013年02月11日 ⁄ 综合 ⁄ 共 2065字 ⁄ 字号 评论关闭

3.4 材质对象

      材质和纹理有很多相似的地方,它们都分别有自己的子材质和子纹理,含有多个子材质的材质称之为多材质。在3DS MAX中,每个结点都关联一个材质,INode::GetMtl()和INode::SetMtl()可以获取和设置结点的材质。GetMtl()返回一个Mtl类指针,如果该方法返回NULL,则说明用户还没有为结点关联材质,这样的话渲染器会自动使用结点的线框颜色来渲染物体。GetMtl()返回的材质可以是用户关联的任何材质,可以是3ds max中的标准材质或者是第三方开发的材质。可以查看每个材质的类标识符来区分各种不同类型的材质,比如3ds max的标准材质的类标识符为DMTL_CLASS_ID,而多材质类型材质的类标识符为MULTI_CLASS_ID.
      (1) 3ds max标准材质:标准材质的ClassID为DMTL_CLASS_ID,这种材质没有子材质,但是有很多属性参数可以为开发者使用。标准材质的主要类为StdMat,它提供了一系列方法来存取材质的属性,类如明暗度、漫反射颜色、环境光颜色、高光颜色,反光和透明度等。开发者也可以存取贴图,比如得到漫反射纹理。(GetSubTexmap()、SetSubTexmap())。
      (2) 多材质:多材质的ClassID为MULTI_CLASS_ID,多材质插件可以为不同的面片设置不同的子材质,通过索引匹配。面片的getMatlID()和setMatlID()即是匹配子材质的方法。多材质可以有多个子材质,子材质的数目可以由NumSubMtls()获得,GetSubMtl()/SetSubMtl()可是设置子材质。在面片匹配材质的时候MatID注意不要大于子材质的个数,也就是说,不能索引越界。
      3DS MAX可以库的方式存储一组材质,称之为材质库,MtlBaseLib类,可以使用Interface类的LoadMaterialLib()、SaveMaterialLib()方法来装载保存材质库,GetMaterialLibrary()可以返回当前正在使用的一个材质库引用(MtlBaseLib&)。
      创建不同类型的纹理实例的方法见下:
      • StdMat *NewDefaultStdMat();
      • MultiMtl *NewDefaultMultiMtl();
      • BitmapTex *NewDefaultBitmapTex();
      • MultiTex *NewDefaultCompositeTex();
      • MultiTex *NewDefaultMixTex();
      • MultiTex *NewDefaultTintTex();
      • GradTex *NewDefaultGradTex();
      • StdCubic *NewDefaultStdCubic();
      • StdMirror *NewDefaultStdMirror();
      • StdFog *NewDefaultStdFog();
        //组合两个材质为多材质类型
      • Mtl *CombineMaterials(Mtl *mat1, Mtl *mat2, int &mat2Offset);
3.5 纹理贴图对象

      纹理贴图大家都比较熟悉,常见的如漫反射贴图、高光贴图、凹凸贴图等,他们都用图像的方式来体现模型的细节。纹理映射主要解决的是模型的几何坐标和纹理贴图的UV坐标之间的对应关系。
     总的来说,对应关系其实很容易理解,仅仅是从一个坐标系转换到另一个坐标系,比如平面映射,模型的几何顶点都被转换到平面坐标系统上,转换之后就称之为UV坐标系;而对于圆柱映射是同样的道理,只不过它不仅仅只有X, Y两个分量,而是三维分量,U, V, W构成了变换后的UV坐标系。摄像机映射也是这个道理,模型的纹理坐标匹配到一张背景图片上,而几何顶点被变换到摄像机屏幕空间,然后屏幕的X, Y坐标就组成了UV坐标系。
    纹理的种类主要有:
    • TCHAR TEXMAP_CAT_2D[];              //二维贴图
    • TCHAR TEXMAP_CAT_3D[];              //三维贴图
    • TCHAR TEXMAP_CAT_COMP[];         //组合贴图
    • TCHAR TEXMAP_CAT_COLMOD[];    //颜色修改器
    • TCHAR TEXMAP_CAT_ENV[];           //环境纹理
      通常使用的多是二维贴图,至于贴图的UV坐标想必使用过OpenGL的都已经了然于胸了,不再多说。
     值得一提的是法线贴图
。法线贴图是比较常用的凹凸贴图方法,原理简单,就是模型面片上的每个像素点的法线都保存在RGB图像中,因为法线是三维向量,正好对应于颜色的三个分量R、G、B。由于法线图中的法线值一般是以切线空间存放,因此灯光到顶点的向量要先转到切线空间后再与法线进行光照运算。

抱歉!评论已关闭.