青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

麒麟子

~~

導航

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

統計

常用鏈接

留言簿(12)

隨筆分類

隨筆檔案

Friends

WebSites

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜

魔獸世界客戶端數據研究(三)

終于決定,還是通過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要使用數據的時候,只需要保存一些索引值,再到全局數據里去查詢就可以了。

暫時到此吧,下次繼續。。。。

posted on 2013-04-26 01:11 麒麟子 閱讀(2073) 評論(2)  編輯 收藏 引用 所屬分類: BLIZZARD

評論

# re: 魔獸世界客戶端數據研究(三) 2013-04-26 08:03 rosan

LZ加油,呵呵,我會繼續關注的。希望最后能夠寫一些代碼來說明你的文章  回復  更多評論   

# re: 魔獸世界客戶端數據研究(三) 2013-05-04 03:57 monn

謝謝樓主,,期待下一篇~  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区二区三区视频| 一区二区欧美激情| 久久精品中文| 理论片一区二区在线| 在线日本高清免费不卡| 欧美黄色一级视频| 午夜精品999| 91久久国产综合久久| 久久综合影视| 亚洲无吗在线| 亚洲高清网站| 久久九九久精品国产免费直播| 亚洲一二三四区| 亚洲午夜三级在线| 久久精品人人做人人爽| 欧美成人国产| 久久久久久久久久久一区| 夜夜躁日日躁狠狠久久88av| 欧美成人免费全部观看天天性色| 国产精品毛片在线看| 久久久另类综合| 卡一卡二国产精品| 欧美色中文字幕| 欧美精品一区二区三| 欧美aⅴ一区二区三区视频| 欧美在线观看视频一区二区| 亚洲欧美日韩国产精品| 久久嫩草精品久久久久| 久久久精品2019中文字幕神马| 99国产精品99久久久久久粉嫩 | 模特精品裸拍一区| 欧美日韩在线影院| 国产视频亚洲精品| 欧美一区二区三区在线播放| 亚洲主播在线观看| 一区二区三区四区蜜桃| 亚洲国产欧美一区| 亚洲黄色成人久久久| 亚洲欧美日产图| 亚洲欧美日本日韩| 欧美激情第10页| 亚洲精品国产精品久久清纯直播| 99精品免费视频| 亚洲国产三级网| 久久精品日产第一区二区三区 | 欧美视频一区二区三区四区| 狠狠久久亚洲欧美专区| 在线精品亚洲一区二区| 欧美亚洲系列| 榴莲视频成人在线观看| av不卡在线观看| 欧美激情第9页| 亚洲精品久久久久久一区二区| 国产免费成人| 国内精品久久国产| 在线播放精品| 亚洲九九九在线观看| 亚洲私人黄色宅男| 久久精品综合一区| 午夜精品三级视频福利| 欧美激情a∨在线视频播放| 在线观看日韩av电影| 欧美一二三区精品| 亚洲免费视频一区二区| 久久久久久网址| 禁久久精品乱码| 亚洲制服丝袜在线| 亚洲视频网在线直播| 久热精品在线视频| 亚洲二区在线视频| 久久大综合网| 日韩亚洲不卡在线| 久久精品国产清自在天天线| 欧美人成网站| 亚洲一区二区三区视频播放| 久久国产天堂福利天堂| 亚洲欧美日韩第一区| 国产在线视频欧美| 亚洲国产精品t66y| 久久精品女人| 亚洲国产欧美在线| 亚洲国产精品女人久久久| 欧美激情一区二区三区高清视频| 玖玖玖国产精品| 91久久香蕉国产日韩欧美9色| 伊人夜夜躁av伊人久久| 欧美成人精品在线| 亚洲欧美激情诱惑| 国产精品自拍小视频| 国产综合久久久久久鬼色| 久久国产欧美精品| 欧美超级免费视 在线| 一区二区三区 在线观看视频| 久久国产精品一区二区三区| 久久亚洲精品一区二区| 亚洲裸体俱乐部裸体舞表演av| 久久婷婷激情| 一区二区三区精品| 国产主播喷水一区二区| 欧美激情一二三区| 国产欧美日韩高清| 欧美在线黄色| 久久天堂国产精品| 午夜在线视频观看日韩17c| 久久中文欧美| 久久国产一区| 国产精品久久久久久久久动漫| 国产视频一区欧美| 亚洲大片av| 国产亚洲aⅴaaaaaa毛片| 亚洲黄一区二区三区| 国产一区二区中文字幕免费看| 亚洲欧美www| 欧美成人在线影院| 老司机午夜精品视频在线观看| 亚洲欧美一区二区原创| 99在线热播精品免费99热| 亚洲人线精品午夜| 精品成人在线| 欧美亚洲自偷自偷| 精品动漫一区二区| 亚欧成人在线| 欧美一区二区三区精品| 国产精品国产三级国产aⅴ浪潮| 99视频精品全国免费| 久久一区二区精品| 欧美 亚欧 日韩视频在线| 国产午夜久久| 亚欧成人在线| 久久久噜噜噜久久中文字免 | 亚洲精品乱码久久久久久蜜桃91| 美女主播视频一区| 亚洲精品一区二区三区av| 亚洲欧美日韩高清| 欧美一区二区啪啪| 国产欧美在线播放| 西瓜成人精品人成网站| 欧美一区二区三区在线观看| 国产精品社区| 欧美大香线蕉线伊人久久国产精品| 美国十次了思思久久精品导航| 国产亚洲在线| 亚洲国产欧美在线人成| 久久久久国产一区二区三区| 久久不射2019中文字幕| 国语自产精品视频在线看抢先版结局 | 最新国产精品拍自在线播放| 国产自产在线视频一区| 欧美中文在线视频| 久久综合九色| 亚洲人成人99网站| 欧美视频专区一二在线观看| 亚洲五月六月| 久久亚洲国产成人| 在线欧美福利| 欧美激情一区| 亚洲免费中文字幕| 美女性感视频久久久| 欧美性猛交一区二区三区精品| 亚洲黄色免费网站| 免费看精品久久片| 99精品国产一区二区青青牛奶| 国产主播一区二区三区四区| 久久久久久穴| 亚洲日本国产| 欧美专区在线| 亚洲激情国产精品| 国产精品国产馆在线真实露脸| 亚洲国产精品久久久久秋霞影院| 国产精品主播| 欧美成人午夜激情在线| 夜夜爽av福利精品导航| 老司机精品视频网站| 亚洲午夜激情网站| 亚洲第一页自拍| 国产日韩欧美二区| 欧美另类videos死尸| 欧美一级欧美一级在线播放| 亚洲电影中文字幕| 久久久久久久久综合| 正在播放欧美一区| 精品成人在线观看| 国产精品日韩高清| 欧美成人日本| 久久精品国产精品| 亚洲欧美国产另类| 一区二区三区四区蜜桃| 亚洲精华国产欧美| 久久一综合视频| 欧美一区激情视频在线观看| 9i看片成人免费高清| 亚洲狠狠婷婷| 亚洲国产成人精品视频| 国产视频一区免费看| 国产精品成人免费精品自在线观看| 亚洲深夜影院| 亚洲精品日韩在线| 亚洲欧美在线一区二区| 国产农村妇女精品一二区| 欧美成人国产va精品日本一级|