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

麒麟子

~~

導航

<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>
            国产一区二区三区在线观看视频 | 噜噜噜躁狠狠躁狠狠精品视频| 一本色道久久88综合亚洲精品ⅰ | 国产欧美精品一区二区三区介绍| 亚洲欧美日韩一区在线观看| 亚洲制服少妇| 国产情人综合久久777777| 久久国产福利| 久久综合久久综合久久综合| 亚洲三级视频在线观看| 日韩亚洲国产精品| 国产精品午夜春色av| 久久久免费av| 欧美成人国产| 亚洲欧美日韩国产精品| 久久福利电影| 夜夜嗨av一区二区三区网页| 亚洲一区一卡| 亚洲成色最大综合在线| 久久婷婷av| 亚洲国产日本| 亚洲嫩草精品久久| 亚洲人成高清| 亚洲女优在线| 亚洲日本中文字幕| 亚洲一线二线三线久久久| 亚洲国产精品电影在线观看| 一区二区三区日韩| 亚洲春色另类小说| 亚洲图色在线| 妖精视频成人观看www| 羞羞色国产精品| 日韩一区二区精品视频| 久久黄色影院| 亚洲自拍都市欧美小说| 久久综合影视| 久久久久国产一区二区三区| 欧美日韩国产经典色站一区二区三区| 欧美中文日韩| 欧美视频一区在线观看| 欧美电影在线观看| 国产亚洲一区二区三区| 在线综合亚洲| 一区二区三区鲁丝不卡| 麻豆91精品| 久久综合图片| 国内精品**久久毛片app| 亚洲四色影视在线观看| 夜夜狂射影院欧美极品| 你懂的网址国产 欧美| 久久免费少妇高潮久久精品99| 欧美午夜美女看片| 91久久视频| 亚洲国产精品久久久久婷婷老年 | 亚洲午夜精品视频| 99视频在线观看一区三区| 麻豆成人在线播放| 欧美91福利在线观看| 很黄很黄激情成人| 欧美有码视频| 久久久久久亚洲精品不卡4k岛国| 国产精品一区二区视频| 亚洲午夜小视频| 亚洲欧美日韩国产综合精品二区| 欧美视频你懂的| 日韩视频在线观看| 在线视频精品一区| 欧美日韩视频| 中文av字幕一区| 午夜激情综合网| 国产亚洲精品高潮| 久久精品视频在线免费观看| 另类欧美日韩国产在线| 有坂深雪在线一区| 欧美成人一区在线| 日韩视频三区| 欧美一区二区大片| 国产一区二区三区在线播放免费观看| 欧美一区午夜视频在线观看| 久久婷婷丁香| 亚洲精品久久久久久一区二区| 欧美国产日韩一二三区| 99在线观看免费视频精品观看| 亚洲综合久久久久| 国产一区二区三区在线观看网站 | 国产精品一卡| 久久av一区二区三区| 欧美成人性生活| 一区二区三区高清在线观看| 国产精品系列在线播放| 久久久999国产| 亚洲激情六月丁香| 午夜精品三级视频福利| 激情婷婷欧美| 欧美另类一区二区三区| 午夜日韩在线观看| 欧美激情亚洲精品| 亚洲欧美电影在线观看| 亚洲第一在线视频| 国产精品jizz在线观看美国| 久久国产主播| 一二三区精品| 蜜臀久久99精品久久久画质超高清| 亚洲精品男同| 国产一级久久| 欧美日韩精品免费观看视一区二区| 亚洲欧美日韩国产中文| 亚洲国产黄色| 久久国产一区| 正在播放欧美视频| 激情婷婷欧美| 国产精品久久久久久亚洲调教 | 欧美不卡一区| 欧美在线视频网站| 一二三区精品福利视频| 欧美成人免费全部| 久久精品一区四区| 亚洲影音先锋| 一本久道久久久| 91久久精品视频| 一色屋精品视频免费看| 国产精品亚洲产品| 欧美日韩精品免费| 欧美sm视频| 久久综合久久综合九色| 久久爱www久久做| 午夜国产精品视频| 一区二区久久久久久| 亚洲国产日韩欧美在线99| 老司机精品久久| 久久久91精品国产一区二区三区 | 一本色道久久综合精品竹菊| 亚洲国产另类久久精品| 美女精品视频一区| 久久综合成人精品亚洲另类欧美| 午夜精彩国产免费不卡不顿大片| 亚洲理伦在线| 亚洲精品社区| 亚洲日本激情| 亚洲精品一区二区三区在线观看| 亚洲电影免费观看高清| 欧美国产乱视频| 亚洲电影在线播放| 亚洲成人自拍视频| 亚洲第一搞黄网站| 最新日韩av| 99这里有精品| 亚洲一区二区三区高清不卡| 亚洲性图久久| 欧美一级日韩一级| 久久精品一区中文字幕| 巨胸喷奶水www久久久免费动漫| 久热国产精品| 欧美日韩免费在线视频| 国产精品久久久久久久久搜平片 | 久久久夜色精品亚洲| 美女视频黄免费的久久| 欧美国产激情二区三区| 亚洲美女色禁图| 亚洲一区二区免费视频| 久久aⅴ国产欧美74aaa| 麻豆精品91| 欧美天堂亚洲电影院在线观看| 国产精品毛片| 精品不卡在线| 一区二区激情小说| 欧美一区二区三区视频| 欧美bbbxxxxx| 99视频超级精品| 午夜日韩福利| 欧美成人激情视频免费观看| 欧美午夜剧场| 一区国产精品| 亚洲视频中文字幕| 久久久久九九九| 最新国产拍偷乱拍精品| 性欧美8khd高清极品| 欧美阿v一级看视频| 国产精品毛片大码女人| 在线看不卡av| 午夜综合激情| 亚洲高清免费| 欧美一区二区福利在线| 欧美福利电影网| 国产日韩一区在线| 亚洲无线视频| 欧美成人精品在线观看| 亚洲一区国产精品| 欧美黄色网络| 影院欧美亚洲| 欧美一区二区在线免费观看| 亚洲人成网站在线观看播放| 欧美影院视频| 国产精品日韩欧美综合| 中国成人亚色综合网站| 女仆av观看一区| 欧美一区二区三区四区高清| 欧美三级网页| 亚洲精品一级| 欧美激情中文不卡|