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

麒麟子

~~

導(dǎo)航

<2013年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

統(tǒng)計(jì)

常用鏈接

留言簿(12)

隨筆分類

隨筆檔案

Friends

WebSites

積分與排名

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

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

終于決定,還是通過(guò)wow model viewer起手,研究一下WOW的數(shù)據(jù)類型,從另一個(gè)角度,體驗(yàn)一把這個(gè)唯一讓我充過(guò)值的游戲。

這將是一系列隨筆,即在讀代碼的時(shí)候,順便記錄,以理清思路和加深映象。 其中會(huì)有很多讓人費(fèi)解的地方,如果有幸被某位兄弟看見(jiàn)

,請(qǐng)勿見(jiàn)笑。

 

今天來(lái)說(shuō)一下M2中的LOD的數(shù)據(jù)

WOW中,為了降低遠(yuǎn)處模型的渲染開(kāi)銷,為模型做了LOD,即遠(yuǎn)處的模型,使用更少的頂點(diǎn),更粗略的材質(zhì)。 比如遠(yuǎn)處的模型在渲染的時(shí)

候,面片數(shù)量減少,關(guān)閉光照,不渲染掛接的特效等等。

因此,不用證明也知道,M2中,材質(zhì)是存在每一個(gè)LOD信息中的。
哎,也就寫(xiě)這幾句的時(shí)候順手些,其實(shí)不用分析,也是這個(gè)結(jié)果。因?yàn)槲覀冏约旱囊婢褪沁@樣做的,何況是WOW這種大師級(jí)的作品呢。

從WMV的解析代碼下手,看看它是如何解析的吧。
首先,它使用了這樣一行代碼
int16 *transLookup = (int16*)(f.getBuffer() + header.ofsTransparencyLookup);
讀取了一串用于透明值的查找數(shù)組。 不過(guò)暫時(shí)沒(méi)有使用,后面材質(zhì)構(gòu)建的地方才會(huì)用到。
接下來(lái),就是讀取相關(guān)數(shù)據(jù)了。 在WLK以后,所有的這些數(shù)據(jù),被分離到了.skin文件里面,不知道是咱想的,以后再來(lái)作討論。 但是在

WLK之前,這個(gè)數(shù)據(jù)還是被放在了一起的。

通過(guò)模型的名字我們組合上.skin,就是當(dāng)前所要的渲染數(shù)據(jù)了。
這個(gè)組合是這樣的。
假如我們一個(gè)模型是 humanmale.m2
那么它的四個(gè)LOD數(shù)據(jù)分別就是 humanmale01.skin humanmale02.skin humanmale03.skin humanmale04.skin

當(dāng)我們得到了這個(gè)數(shù)據(jù)后,就可以通過(guò)MPQFile加載想要的數(shù)據(jù)了。

OK,假設(shè)上面的過(guò)程,我們已經(jīng)完全搞定了,此時(shí),我們就得到了一個(gè)skin的數(shù)據(jù)。有了這個(gè)數(shù)據(jù),我們就可以為所欲為了,嘿嘿。有點(diǎn)

夸張了。 在這個(gè)數(shù)據(jù)的最前面,肯定是數(shù)據(jù)頭了。 數(shù)據(jù)頭在WMV中本來(lái)一直是以xxxxHeader來(lái)定義的,不過(guò)在這里,它一改風(fēng)格,定義

了一個(gè)叫ModelView的東西。

我們來(lái)看看這貨的定義
struct ModelView
{
#ifdef WotLK
    char id[4]; //巫妖王版本新增的一個(gè)標(biāo)記位,必須是 'S' 'K' 'I' 'N'
#endif
    uint32 nIndex; //這個(gè)表示此LOD有多少個(gè)INDEX
    uint32 ofsIndex; //這個(gè)表示此LOD的INDEX從模型的哪里開(kāi)始數(shù)
    uint32 nTris; //這個(gè)表示此LOD有多少個(gè)構(gòu)建成三角形的索引
    uint32 ofsTris;     //三角形個(gè)數(shù)
    uint32 nProps; //額外的頂點(diǎn)屬性
    uint32 ofsProps; //頂點(diǎn)屬性讀取
    uint32 nSub; //有多少個(gè)子部件 后面定義的ModelGeoset表示一個(gè)子部件,其包括了MESH數(shù)據(jù),材質(zhì),渲染狀態(tài)等內(nèi)容
    uint32 ofsSub;     //
    uint32 nTex;  //紋理
    uint32 ofsTex;     // ModelTexUnit, material properties/textures
    int32 lod;                 // LOD bias?  WMV作者也打了問(wèn)號(hào)。
};

有了這個(gè)數(shù)據(jù)頭以后,我們就可以無(wú)腦的先讀取上面的數(shù)據(jù),然后再進(jìn)行構(gòu)建。

索引數(shù)據(jù)
uint16 *indexLookup = (uint16*)(g.getBuffer() + view->ofsIndex);
構(gòu)成三角形的頂點(diǎn)索引序列
uint16 *triangles = (uint16*)(g.getBuffer() + view->ofsTris);

當(dāng)前模型在渲染時(shí)候的索引數(shù)目
nIndices = view->nTris;
重新分配索引
wxDELETEA(indices);
indices = new uint16[nIndices];

將本地索引轉(zhuǎn)換成全局索引
for (size_t i = 0; i<nIndices; i++)
{
        indices[i] = indexLookup[triangles[i]];
}

索引數(shù)據(jù)總算是完了,下面就得準(zhǔn)備子模型和材質(zhì)相關(guān)的事情。
大家都知道,在渲染管線中,一次渲染提交只能提交具有相同渲染狀態(tài)和紋理的模型。 于是,我們的模型如果具有不同的材質(zhì),就需要

先做分割處理。 這是所有WOW這樣的3D MMORPG引擎都需要處理的問(wèn)題。

在WMV中,模型渲染狀態(tài)相關(guān)的數(shù)據(jù),使用了ModelGeoset來(lái)表示,紋理相關(guān)的,使用了ModelTexUnit來(lái)表示
先看看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;
};

由上可知,它定義了渲染相關(guān)的頂點(diǎn),以及骨骼,和包圍盒信息,最后一個(gè)是作為構(gòu)建包圍球用的。

/// 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.
};
而上面這個(gè)結(jié)構(gòu),是紋理相關(guān)的信息。

上面的信息,都是一些索引和ID值,真正的數(shù)據(jù)是放在全局信息中的。

讀取完上面的數(shù)據(jù)后,LOD信息基本上就大功造成了。 而這些索引是如何使用的,只有下一次再研究了。今天又很晚了。

由此可知,WOW中的數(shù)據(jù)組織和一般的引擎沒(méi)有太多區(qū)別。 即HEADER信息用于分割數(shù)據(jù)區(qū)域。
整個(gè)模型要使用的數(shù)據(jù),放在了最上層,然后,不同的LOD和子MESH要使用數(shù)據(jù)的時(shí)候,只需要保存一些索引值,再到全局?jǐn)?shù)據(jù)里去查詢就可以了。

暫時(shí)到此吧,下次繼續(xù)。。。。

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

評(píng)論

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

LZ加油,呵呵,我會(huì)繼續(xù)關(guān)注的。希望最后能夠?qū)懸恍┐a來(lái)說(shuō)明你的文章  回復(fù)  更多評(píng)論   

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

謝謝樓主,,期待下一篇~  回復(fù)  更多評(píng)論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            免费在线看成人av| 免费在线国产精品| 国产欧美另类| 久久精品在线免费观看| 欧美亚洲综合网| 精品1区2区| 亚洲国产精品va在线观看黑人 | 亚洲免费视频一区二区| 午夜欧美电影在线观看| 一区免费观看视频| 亚洲乱码国产乱码精品精可以看| 欧美日韩亚洲激情| 久久久91精品国产一区二区精品| 久久久精品日韩欧美| 日韩亚洲欧美成人一区| 亚洲在线一区二区三区| 亚洲成色www久久网站| 亚洲精品日韩欧美| 狠狠久久亚洲欧美专区| 亚洲片区在线| 狠狠综合久久av一区二区小说| 亚洲国产免费看| 国产精品入口日韩视频大尺度| 蜜桃av综合| 欧美亚洲成人免费| 欧美国产先锋| 国产伦精品一区二区三区照片91 | 一区二区三区www| 性欧美超级视频| 中文精品在线| 久久免费精品日本久久中文字幕| 亚洲综合大片69999| 久热精品视频在线观看一区| 午夜国产不卡在线观看视频| 免费亚洲网站| 久久婷婷色综合| 欧美视频手机在线| 亚洲国产一区二区三区高清| 精品成人在线观看| 午夜精品一区二区在线观看| 亚洲美女av电影| 久久久久久电影| 欧美一区深夜视频| 国产精品成人观看视频免费 | 欧美一二三视频| 欧美成人精品不卡视频在线观看| 久久精品成人一区二区三区蜜臀| 欧美日韩情趣电影| 亚洲激情中文1区| 在线观看视频一区二区| 欧美伊久线香蕉线新在线| 亚洲在线视频免费观看| 欧美日韩国产123区| 亚洲大胆人体视频| 亚洲成色精品| 免费成人av在线| 欧美国产激情| 亚洲国产高清自拍| 久久综合综合久久综合| 毛片av中文字幕一区二区| 国产揄拍国内精品对白| 欧美一区网站| 久久久国产精品亚洲一区 | 久久一区二区三区国产精品| 久久综合九色综合久99| 在线观看亚洲a| 老司机精品导航| 亚洲国产精品精华液网站| 亚洲国产精品一区二区第四页av | 欧美一区在线看| 久久综合网hezyo| 亚洲国产精品一区二区尤物区| 久久精品免费观看| 欧美成人午夜剧场免费观看| 亚洲美女电影在线| 欧美色一级片| 欧美有码在线视频| 亚洲大片在线| 亚洲伊人久久综合| 国产日韩三区| 老司机精品视频一区二区三区| 亚洲福利一区| 亚洲免费综合| 一区二区三区在线免费观看| 欧美成人精品影院| 亚洲在线播放电影| 免费看的黄色欧美网站| 一区二区三区欧美日韩| 国产欧美一区二区三区另类精品| 久久久久久久综合| 亚洲精品在线二区| 久久久成人网| 在线视频欧美日韩精品| 国产日韩一区二区三区| 欧美xart系列高清| 亚洲欧美视频一区| 欧美国产精品日韩| 亚洲欧美日本日韩| 99精品视频一区| 久久国产日韩欧美| 99在线热播精品免费| 国产乱码精品1区2区3区| 久久综合一区| 亚洲欧美在线视频观看| 亚洲高清久久| 久久久99免费视频| 亚洲淫性视频| 91久久极品少妇xxxxⅹ软件| 国产精品婷婷| 欧美日本韩国在线| 久久尤物视频| 欧美一区日韩一区| 亚洲夜间福利| 亚洲美女在线国产| 欧美大尺度在线| 久久九九电影| 亚洲欧美日韩国产成人精品影院| 亚洲成在线观看| 国产日韩欧美电影在线观看| 欧美日韩综合在线| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久久久国产一区二区| 亚洲色图在线视频| 亚洲人成网站999久久久综合| 久久久欧美精品| 久久av免费一区| 亚洲欧美在线网| 亚洲欧美国产一区二区三区| 日韩视频三区| 亚洲狼人综合| 日韩午夜在线播放| 亚洲精品一区二区三区蜜桃久| 在线观看成人一级片| 在线观看欧美日韩国产| 黄色成人av| 伊人狠狠色j香婷婷综合| 国内久久婷婷综合| 一区二区三区中文在线观看| 国内伊人久久久久久网站视频| 国产午夜精品福利| 国产综合亚洲精品一区二| 国产香蕉97碰碰久久人人| 国产精品一区在线观看你懂的| 国产精品免费一区二区三区在线观看 | 久久精品亚洲一区二区三区浴池| 午夜欧美精品| 久久先锋影音av| 欧美不卡高清| 欧美日韩一区二区免费视频| 欧美日韩国产区| 欧美午夜不卡影院在线观看完整版免费| 欧美国产亚洲另类动漫| 欧美女同视频| 国产精品视频专区| 黄色成人在线免费| 91久久精品国产91久久| 一区二区冒白浆视频| 午夜精品偷拍| 免费观看日韩av| 亚洲国产综合在线| 亚洲一区二区三区三| 欧美在线免费视频| 欧美粗暴jizz性欧美20| 欧美色中文字幕| 国产一区二区三区视频在线观看| 亚洲成人自拍视频| 一区二区三区福利| 久久国内精品视频| 亚洲国产成人精品久久| 一区二区三区欧美成人| 久久er99精品| 欧美日韩国产综合久久| 国产色视频一区| 亚洲精品中文字幕在线| 午夜精品久久久久久久| 欧美成人一区二区| 亚洲午夜精品一区二区三区他趣| 久久久精品2019中文字幕神马| 欧美精品一区二区三区在线看午夜| 国产精品一区二区欧美| 亚洲激情av| 久久久精品免费视频| 日韩一级二级三级| 久久久久久久久久久久久9999| 欧美日韩国产不卡在线看| 伊人成人在线视频| 小嫩嫩精品导航| 亚洲国产裸拍裸体视频在线观看乱了| 99国产精品一区| 蜜臀av在线播放一区二区三区| 国产精品日韩欧美综合| 日韩视频在线观看国产| 久久先锋资源| 亚洲欧美日韩区 | 欧美一区二区三区另类 | 国产精品va在线播放| 亚洲精品视频一区| 老牛影视一区二区三区| 亚洲尤物视频在线| 欧美午夜精品理论片a级按摩|