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

麒麟子

~~

導航

<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>
            欧美日韩第一页| 欧美日韩一卡| 亚洲摸下面视频| 亚洲国产黄色| 久久久久久伊人| 亚洲一区二区三区乱码aⅴ| 亚洲韩国精品一区| 国产伦精品一区二区三区高清版| 亚洲婷婷综合久久一本伊一区| 美女视频黄a大片欧美| 亚洲亚洲精品三区日韩精品在线视频| 亚洲精品少妇30p| 亚洲欧洲精品一区二区三区| 国产精品福利网站| 亚洲影院在线| 一本色道久久99精品综合| 国产日韩一区二区| 亚洲视频axxx| 亚洲香蕉网站| 久久久www| 性视频1819p久久| 久久久亚洲国产天美传媒修理工 | 韩国精品主播一区二区在线观看| 亚洲免费av网站| 正在播放亚洲一区| 亚洲区在线播放| 日韩一级精品| 韩国精品一区二区三区| 在线性视频日韩欧美| 国产精品久久久久久久久久久久 | 久久尤物视频| 欧美mv日韩mv国产网站| 久久―日本道色综合久久| 久久亚洲综合色| 一本在线高清不卡dvd| 久热国产精品视频| 国产日韩欧美精品一区| 亚洲性图久久| 欧美一进一出视频| 国产欧美日韩亚洲精品| 亚洲欧美在线另类| 久久精品国产99| 国产视频一区欧美| 欧美日本不卡高清| 午夜视频在线观看一区二区三区 | 国产日韩综合一区二区性色av| 欧美一级大片在线免费观看| 欧美激情片在线观看| 免费观看亚洲视频大全| 亚洲精品一区二区三区av| 国产午夜一区二区三区| 亚洲黄色影院| 欧美激情一区二区久久久| 亚洲一区二区网站| 久久久久国产一区二区三区四区 | 国产精品高精视频免费| 亚洲黄色成人| 一区在线视频观看| 一区二区三区日韩精品视频| 狠狠久久五月精品中文字幕| av成人激情| 亚洲毛片av在线| 久久躁日日躁aaaaxxxx| 久久午夜国产精品| 国产日韩一区二区| 亚洲欧美国产va在线影院| 亚洲欧美日本另类| 欧美日韩成人在线| 亚洲人成网站色ww在线| 激情久久五月天| 亚洲欧洲99久久| 亚洲欧美日韩国产中文在线| 欧美激情视频一区二区三区在线播放 | 最新日韩精品| 久久国产精品免费一区| 亚洲国产欧美日韩| 欧美精品日本| 狂野欧美激情性xxxx欧美| 99视频精品全部免费在线| 久久久久一区| 亚洲男人第一av网站| …久久精品99久久香蕉国产| 欧美日韩国产免费| 亚洲欧美日韩一区| 亚洲伦理网站| 激情丁香综合| 欧美一区二粉嫩精品国产一线天| 久久精品国产综合精品| 国产一区二区三区四区| 久久xxxx| 久热re这里精品视频在线6| 国产一区二区黄| 夜夜嗨av一区二区三区| 久久精品视频亚洲| 亚洲一区观看| 亚洲视频自拍偷拍| 亚洲精品日韩综合观看成人91| 国产日本欧洲亚洲| 欧美精品一卡二卡| 欧美人成网站| 久久漫画官网| 嫩草影视亚洲| 亚洲天堂免费观看| 日韩视频在线观看国产| 亚洲国产精品久久久久秋霞影院| 性欧美videos另类喷潮| 一区二区三区蜜桃网| 亚洲欧洲日产国码二区| 亚洲高清在线精品| 亚洲黄色有码视频| 91久久精品视频| 在线精品一区| 亚洲三级毛片| 亚洲精品久久久久久久久久久久 | 一区二区欧美日韩| 亚洲一级在线观看| 正在播放亚洲一区| 亚洲一区二区三区在线看| 午夜国产精品视频免费体验区| 一本色道婷婷久久欧美| 一区二区三区精密机械公司 | 欧美国产日韩在线| 欧美激情精品久久久| 欧美成人一二三| 日韩视频不卡| 一本色道久久精品| 亚洲欧美日韩中文视频| 欧美激情综合亚洲一二区| 久久不射中文字幕| 亚洲性色视频| 最新国产乱人伦偷精品免费网站| 久久影视精品| 久久成年人视频| 亚洲女人av| 亚洲欧美日本日韩| 亚洲精品一区二区三区福利| 黄色一区二区在线| 欧美高清视频一区| 美女国内精品自产拍在线播放| 欧美xx视频| 国产精品二区在线| 亚洲第一二三四五区| 亚洲精品专区| 亚洲视频一起| 老司机免费视频一区二区三区| 免费亚洲一区二区| 欧美韩日亚洲| 亚洲少妇最新在线视频| 久久精品国产成人| 欧美欧美午夜aⅴ在线观看| 国产精品性做久久久久久| 老牛嫩草一区二区三区日本| 中文国产成人精品| 久久久视频精品| 一区二区日韩| 欧美成熟视频| 国产免费一区二区三区香蕉精| 亚洲人成网站777色婷婷| 欧美一区网站| 99v久久综合狠狠综合久久| 久久久精品2019中文字幕神马| 国产精品久久久久三级| 亚洲欧洲一区二区三区| 久久免费视频网站| 亚洲午夜一区| 欧美日韩国产精品| 亚洲第一在线综合网站| 久久av一区二区| 一区二区免费看| 欧美欧美全黄| 欧美国产免费| 欧美一区二区国产| 国产精品久久精品日日| 亚洲免费播放| 亚洲国产精品久久| 裸体歌舞表演一区二区| 黑人巨大精品欧美黑白配亚洲| 欧美在线中文字幕| 亚洲一区二区三区四区中文| 欧美丝袜一区二区三区| 99亚洲一区二区| 亚洲国产精品一区二区尤物区 | 亚洲人成高清| 亚洲国产91| 亚洲国产日韩一区二区| 最新亚洲一区| 亚洲网友自拍| 久久久精品欧美丰满| 久久精品国产免费观看| 久久久综合网站| 欧美ed2k| 国产精品毛片a∨一区二区三区|国| 欧美激情第1页| 欧美日韩高清在线播放| 欧美日韩亚洲天堂| 亚洲午夜黄色| 久久午夜电影| 亚洲国产清纯| 亚洲自拍偷拍麻豆| 国产精品久久久久永久免费观看 |