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

麒麟子

~~

導(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一区二区三区在线观看 | 亚洲精品网址在线观看| 国产欧美三级| 国产精品美女久久久久久免费| 国产精品日韩电影| 一区二区视频欧美| 亚洲精品视频在线播放| 亚洲主播在线播放| 噜噜噜噜噜久久久久久91| 亚洲激情视频| 欧美一区二区大片| 欧美成人dvd在线视频| 国产精品国产三级国产普通话三级 | 欧美激情一区二区三级高清视频| 欧美巨乳在线观看| 国产伪娘ts一区| 一本大道av伊人久久综合| 久久激情一区| 日韩一级片网址| 久久久视频精品| 国产精品美女主播在线观看纯欲| 亚洲第一区在线| 久久久精品欧美丰满| 日韩视频在线一区二区| 蜜桃av一区| 激情六月综合| 久久gogo国模裸体人体| 一区二区三区四区五区视频 | 美女爽到呻吟久久久久| 99国产精品久久久久老师| 久久婷婷麻豆| 国产一区二区三区四区在线观看| 亚洲无线视频| 亚洲精品视频免费观看| 久久免费国产精品1| 国产免费成人| 欧美一区二区视频在线| 欧美一区二区三区四区视频 | 亚洲一区国产一区| 欧美日韩国内自拍| 亚洲欧洲另类国产综合| 久久人人爽人人爽| 欧美亚洲视频一区二区| 国产人成一区二区三区影院| 午夜宅男欧美| 亚洲伊人色欲综合网| 欧美色精品天天在线观看视频| 91久久精品国产| 欧美成人免费一级人片100| 久久成人在线| 在线观看亚洲| 欧美成人在线免费视频| 久久综合国产精品| 国产亚洲精品v| 久久精品亚洲一区二区三区浴池| 国产日韩亚洲欧美精品| 性久久久久久久久| 亚洲免费小视频| 国产人成精品一区二区三| 久久九九国产精品怡红院| 欧美一级在线视频| 国内精品久久久久久影视8| 久久亚洲精品视频| 久久久综合视频| 亚洲国产女人aaa毛片在线| 亚洲大片在线| 欧美另类综合| 午夜一级久久| 久久成人免费视频| 在线欧美三区| 亚洲精品护士| 国产欧美精品日韩| 麻豆成人在线| 欧美日韩亚洲一区二| 性伦欧美刺激片在线观看| 久久久蜜桃一区二区人| 99视频一区二区三区| 亚洲欧美国产三级| 影音先锋亚洲电影| 日韩视频在线观看| 国产尤物精品| 亚洲国产精品va在线观看黑人 | 欧美国产日韩在线观看| 亚洲欧美www| 久久国产精品久久国产精品| 亚洲人成毛片在线播放| 亚洲视频综合在线| 在线日韩av片| 中日韩午夜理伦电影免费| 红桃视频成人| 9久草视频在线视频精品| 黄色一区二区在线观看| 亚洲精品一区中文| 黄色成人在线网址| 亚洲深夜福利在线| 亚洲国产另类精品专区| 亚洲欧美中文日韩v在线观看| 在线国产日韩| 亚洲宅男天堂在线观看无病毒| 亚洲人永久免费| 欧美一级夜夜爽| 亚洲一区欧美二区| 男人的天堂亚洲| 久久中文在线| 国产三级精品三级| 日韩一区二区久久| 亚洲精选一区| 欧美不卡视频一区发布| 美女尤物久久精品| 国产女主播在线一区二区| 一本久道久久综合婷婷鲸鱼| 亚洲激情电影中文字幕| 久久琪琪电影院| 久久国产精品网站| 国产精品五月天| 一区二区三区精品国产| 亚洲美女视频| 国产精品久久77777| 91久久在线| 日韩视频免费| 欧美成人精品| 亚洲国产视频直播| 亚洲精品精选| 欧美黄色aa电影| 亚洲黄页视频免费观看| 亚洲人成久久| 欧美日韩国产综合一区二区| 亚洲美女中出| 亚洲欧美日韩国产综合精品二区| 国产精品极品美女粉嫩高清在线| 99国内精品久久| 亚洲欧美日韩一区在线观看| 国产精品久久久久久久久久ktv | 欧美日韩国产123区| 亚洲另类在线视频| 亚洲午夜免费视频| 国产精品视频免费| 亚洲专区欧美专区| 欧美一区二区播放| 黄色精品一区二区| 免费在线观看日韩欧美| 亚洲精品国产精品久久清纯直播 | 国产精品理论片| 一区二区三区日韩欧美| 亚洲欧美乱综合| 国产亚洲一区二区三区在线播放 | 欧美午夜无遮挡| 亚洲午夜电影网| 久久久久久黄| 亚洲精品美女| 国产精品日韩精品| 久久精品伊人| 亚洲精品一区在线观看香蕉| 午夜在线一区二区| 亚洲大胆美女视频| 欧美日韩综合精品| 欧美一级免费视频| 欧美激情91| 亚洲伊人网站| 亚洲国产成人porn| 国产精品va在线| 欧美在线亚洲在线| 亚洲综合另类| 国内精品久久久久影院色| 欧美精品一区二区三区四区| 亚洲无限av看| 欧美激情久久久| 久久精品91久久久久久再现| 亚洲欧洲三级电影| 国产日韩欧美在线观看| 欧美黄色aa电影| 久久爱www| 一本久久青青| 亚洲国产精彩中文乱码av在线播放| 亚洲欧美精品中文字幕在线| 亚洲丰满少妇videoshd| 国产伦精品一区二区三区视频孕妇 | 亚洲女爱视频在线| 黄色一区二区三区| 欧美性开放视频| 久久夜色精品国产欧美乱| 一本大道久久精品懂色aⅴ | 亚洲高清视频一区二区| 亚洲欧美日韩系列| 亚洲国产综合91精品麻豆| 国产欧美日本在线| 国产精品久久影院| 欧美日韩免费在线观看| 欧美成人一区二区在线 | 洋洋av久久久久久久一区| 免费看的黄色欧美网站|