终于决定,还是通过wow model viewer起手,研究一下WOW的数据类型,从另一个角度,体验一把这个唯一让我充过值的游戏。

这将是一系列随笔,即在读代码的时候,顺便记录,以理清思路和加深映象。 其中会有很多让人费解的地方,如果有幸被某位兄弟看见

,请勿见笑。

今天来说一下M2中的LOD的数据

WOW中,为了降低远处模型的渲染开销,为模型做了LOD,即远处的模型,使用更少的顶点,更粗略的材质。 比如远处的模型在渲染的时

候,面片数量减少,关闭光照,不渲染挂接的特效等等。

因此,不用证明也知道,M2中,材质是存在每一个LOD信息中的。
哎,也就写这几句的时候顺手些,其实不用分析,也是这个结果。因为我们自己的引擎就是这样做的,何况是WOW这种大师级的作品呢。

从WMV的解析代码下手,看看它是如何解析的吧。
首先,它使用了这样一行代码
int16 *transLookup = (int16*)(f.getBuffer() + header.ofsTransparencyLookup);
读取了一串用于透明值的查找数组。 不过暂时没有使用,后面材质构建的地方才会用到。
接下来,就是读取相关数据了。 在WLK以后,所有的这些数据,被分离到了.skin文件里面,不知道是咱想的,以后再来作讨论。 但是在

WLK之前,这个数据还是被放在了一起的。

通过模型的名字我们组合上.skin,就是当前所要的渲染数据了。
这个组合是这样的。
假如我们一个模型是 humanmale.m2
那么它的四个LOD数据分别就是 humanmale01.skin humanmale02.skin humanmale03.skin humanmale04.skin

当我们得到了这个数据后,就可以通过MPQFile加载想要的数据了。

OK,假设上面的过程,我们已经完全搞定了,此时,我们就得到了一个skin的数据。有了这个数据,我们就可以为所欲为了,嘿嘿。有点

夸张了。 在这个数据的最前面,肯定是数据头了。 数据头在WMV中本来一直是以xxxxHeader来定义的,不过在这里,它一改风格,定义

了一个叫ModelView的东西。

我们来看看这货的定义
struct ModelView
{
#ifdef WotLK
    char id[4]; //巫妖王版本新增的一个标记位,必须是 'S' 'K' 'I' 'N'
#endif
    uint32 nIndex; //这个表示此LOD有多少个INDEX
    uint32 ofsIndex; //这个表示此LOD的INDEX从模型的哪里开始数
    uint32 nTris; //这个表示此LOD有多少个构建成三角形的索引
    uint32 ofsTris;     //三角形个数
    uint32 nProps; //额外的顶点属性
    uint32 ofsProps; //顶点属性读取
    uint32 nSub; //有多少个子部件 后面定义的ModelGeoset表示一个子部件,其包括了MESH数据,材质,渲染状态等内容
    uint32 ofsSub;     //
    uint32 nTex;  //纹理
    uint32 ofsTex;     // ModelTexUnit, material properties/textures
    int32 lod;                 // LOD bias?  WMV作者也打了问号。
};

有了这个数据头以后,我们就可以无脑的先读取上面的数据,然后再进行构建。

索引数据
uint16 *indexLookup = (uint16*)(g.getBuffer() + view->ofsIndex);
构成三角形的顶点索引序列
uint16 *triangles = (uint16*)(g.getBuffer() + view->ofsTris);

当前模型在渲染时候的索引数目
nIndices = view->nTris;
重新分配索引
wxDELETEA(indices);
indices = new uint16[nIndices];

将本地索引转换成全局索引
for (size_t i = 0; i<nIndices; i++)
{
        indices[i] = indexLookup[triangles[i]];
}

索引数据总算是完了,下面就得准备子模型和材质相关的事情。
大家都知道,在渲染管线中,一次渲染提交只能提交具有相同渲染状态和纹理的模型。 于是,我们的模型如果具有不同的材质,就需要

先做分割处理。 这是所有WOW这样的3D MMORPG引擎都需要处理的问题。

在WMV中,模型渲染状态相关的数据,使用了ModelGeoset来表示,纹理相关的,使用了ModelTexUnit来表示
先看看ModelGeoset的定义
/// Lod part, One material + render operation
struct ModelGeoset
{
    uint32 id;        // mesh part id?
    uint16 vstart;    // first vertex, Starting vertex number.
    uint16 vcount;    // num vertices, Number of vertices.
    uint16 istart;    // first index, Starting triangle index (that's 3* the number of triangles drawn so far).
    uint16 icount;    // num indices, Number of triangle indices.
    uint16 nSkinnedBones;    // number of bone indices, Number of elements in the bone lookup table.
    uint16 StartBones;        // ? always 1 to 4, Starting index in the bone lookup table.
    uint16 rootBone;        // root bone?
    uint16 nBones;        //
    Vec3D BoundingBox[2];
    float radius;
};

由上可知,它定义了渲染相关的顶点,以及骨骼,和包围盒信息,最后一个是作为构建包围球用的。

/// Lod part, A texture unit (sub of material)
struct ModelTexUnit
{
    // probably the texture units
    // size always >=number of materials it seems
    uint16 flags;        // Usually 16 for static textures, and 0 for animated textures.
    uint16 shading;        // If set to 0x8000: shaders. Used in skyboxes to ditch the need for depth buffering.

See below.
    uint16 op;            // Material this texture is part of (index into mat)
    uint16 op2;            // Always same as above?
    int16 colorIndex;    // A Color out of the Colors-Block or -1 if none.
    uint16 flagsIndex;    // RenderFlags (index into render flags, TexFlags)
    uint16 texunit;        // Index into the texture unit lookup table.
    uint16 mode;        // See below.
    uint16 textureid;    // Index into Texture lookup table
    uint16 texunit2;    // copy of texture unit value?
    uint16 transid;        // Index into transparency lookup table.
    uint16 texanimid;    // Index into uvanimation lookup table.
};
而上面这个结构,是纹理相关的信息。

上面的信息,都是一些索引和ID值,真正的数据是放在全局信息中的。

读取完上面的数据后,LOD信息基本上就大功造成了。 而这些索引是如何使用的,只有下一次再研究了。今天又很晚了。

由此可知,WOW中的数据组织和一般的引擎没有太多区别。 即HEADER信息用于分割数据区域。
整个模型要使用的数据,放在了最上层,然后,不同的LOD和子MESH要使用数据的时候,只需要保存一些索引值,再到全局数据里去查询就可以了。

暂时到此吧,下次继续。。。。

转载于:https://www.cnblogs.com/qilinzi/archive/2013/04/26/3043890.html

魔兽世界客户端数据研究(三)相关推荐

  1. 魔兽世界客户端数据研究(四):M2文件头分析

    终于决定,还是通过wow model viewer起手,研究一下WOW的数据类型,从另一个角度,体验一把这个唯一让我充过值的游戏. 这将是一系列随笔,即在读代码的时候,顺便记录,以理清思路和加深映象. ...

  2. 魔兽世界客户端数据研究(一)

    终于决定,还是通过wow model viewer起手,研究一下WOW的数据类型,从另一个角度,体验一把这个唯一让我充过值的游戏. 这将是一系列随笔,即在读代码的时候,顺便记录,以理清思路和加深映象. ...

  3. 魔兽世界客户端数据研究(二)

    终于决定,还是通过wow model viewer起手,研究一下WOW的数据类型,从另一个角度,体验一把这 个唯一让我充过值的游戏. 这将是一系列随笔,即在读代码的时候,顺便记录,以理清思路和加深映象 ...

  4. C++socket编程(三):3.7 服务端回应send客户端数据

    为什么提到反馈send客户端数据,是因为本章博客,目前为止都是单线程的.我们一个服务端只能接收第一个连接进行的客户端发送的数据,在这个客户端断开连接之前,我们的服务端都无法接收其他客户端发过来的数据了 ...

  5. 物联网与大数据(三)从大数据看物联网

    关于物联网与大数据的分享,我们已经发布过两期:物联网与大数据(一)介绍了物联网与大数据的含义.背景:从物联网看大数据讨论了物联网形成大数据的主要环节.那么,到底什么是大数据,大数据真正的价值在哪里,如 ...

  6. 大数据领域三个大的技术方向资料

    大数据领域三个大的技术方向: 1.Hadoop大数据开发方向 2.数据挖掘.数据分析&机器学习方向 3.大数据运维&云计算方向 大数据学习什么 Python:Python 的排名从去年 ...

  7. 面部识别数据研究:43年,100个数据集

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:新智元 AI博士笔记系列推荐 周志华<机器学习> ...

  8. 大数据研究,不能“忽悠”

    几个盲人分别摸到了大象的鼻子.耳朵.腿.尾巴和躯体,这张"瞎子摸象"的照片,在"2013中国计算机大会"上出现多次,好几位报告人和讲者,都不约而同地选了这张照片 ...

  9. 基于手机信令数据研究交通出行特征具体实现

    这学期期末智慧交通大作业,我选择使用手机信令数据研究人类交通出行特征,期间我也查阅了许多资料,但绝大多数帖子只有手机信令数据的应用方向,没有具体实现做法.经过一两周的探索,我大概根据数据和应用方向实现 ...

最新文章

  1. 解密中国研发团队如何开发VS2010新特性
  2. python官网下载速度慢-python 官网慢
  3. Camera 涉及的文件70
  4. 关于用Delphi开发的一些基本的套路
  5. 深度学习(17)TensorFlow高阶操作六: 高阶OP
  6. 12个 Linux 中 grep 命令的超级用法实例
  7. ZigBee技术的应用和优势
  8. WPF 代码设置NotifyIcon图标
  9. 公众号管理模块-DouPHP模块化企业网站管理系统v1.6
  10. mysql -connector/j驱动下载
  11. 常用SQL Server数据修复命令DBCC一览(转载)
  12. vc2008编译libjpeg
  13. 频谱仪测试gsm信号测试软件,怎样用频谱分析仪测试和分析GSM信号
  14. 系统坏了用u盘怎么重装系统
  15. strtolower() 把字符串转换为小写字母
  16. react之事件绑定(this、传参)
  17. 【通信】基于Matlab实现动态帧时隙ALOHA(Dynamic Framed Slotted ALOHA)算法
  18. 【荐藏】代谢组学分析系列
  19. java面板的大小_JAVA编程上我定义了几个面板和一个Frame,怎么设置面板的大小???用setSize怎么没用啊?...
  20. 计算机开启时提示键盘错误,进入BIOS自检找不到键盘提示Keyboard error怎么办

热门文章

  1. 1.Hello,Python
  2. 免费测试英语发音的软件,2020英语音标免费版
  3. java oracle database user dsn_跨会话序列化数据库连接
  4. mysql创建数据库没有默认值报错_详解Mysql数据库date, datetime类型设置0000-00-00默认值(default)报错问题...
  5. php位值,php中,如何取得一个整型值的低位和高位值?
  6. leetcode620. 有趣的电影(SQL)
  7. 密码学专题 信息摘要和数字签名指令
  8. pycharm/clion/idea等产品多含代码左移右移操作
  9. 区块链的完整流程 自动化执行代码
  10. x264 struct学习 1