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

天行健 君子當(dāng)自強(qiáng)而不息

網(wǎng)格模型高級(jí)技術(shù)(17)

蒙皮骨骼動(dòng)畫網(wǎng)格模型接口是對(duì)上一節(jié)骨骼動(dòng)畫網(wǎng)格模型接口的擴(kuò)展,添加了處理蒙皮信息的功能。

 

進(jìn)一步擴(kuò)展結(jié)構(gòu)體D3DXMESHCONTAINER

為了在網(wǎng)格模型中包含蒙皮信息,需要進(jìn)一步擴(kuò)展D3DXMESHCONTAINER_DERIVEED,其定義如下:

struct D3DXMESHCONTAINER_DERIVED : public D3DXMESHCONTAINER
{
IDirect3DTexture9** ppTextures;
ID3DXMesh* pOrgMesh;
DWORD MaxBonesInflPerVertex;
DWORD NumAttrGroups;
ID3DXBuffer* pBoneCombBuffer;
D3DXMATRIX** ppBoneMatrices;
D3DXMATRIX** ppBoneOffsetMatrices;
DWORD NumMatrixPalettes;
bool UseSoftwareVP;
};

當(dāng)加載原網(wǎng)格模型并由此生成一個(gè)蒙皮網(wǎng)格時(shí),會(huì)用D3DXMESHCONTAINER::MeshData::pMesh存儲(chǔ)所生成的蒙皮網(wǎng)格模型,這時(shí)需要將初始網(wǎng)格模型保存下來(lái),這就是pOrgMesh的作用。變量MaxBonesInflPerVertex表示每個(gè)頂點(diǎn)最多受多少骨骼的影響,指針變量pBoneCombBuffer指向骨骼結(jié)合表,骨骼結(jié)合表中的數(shù)據(jù)按屬性組結(jié)構(gòu)體D3DXBONECOMBINATION組織起來(lái),該結(jié)構(gòu)體定義如下:

Describes a subset of the mesh that has the same attribute and bone combination.

typedef struct D3DXBONECOMBINATION {
DWORD AttribId;
DWORD FaceStart;
DWORD FaceCount;
DWORD VertexStart;
DWORD VertexCount;
DWORD * BoneId;
} D3DXBONECOMBINATION, *LPD3DXBONECOMBINATION;

Members

AttribId
Attribute table identifier.
FaceStart
Starting face.
FaceCount
Face count.
VertexStart
Starting vertex.
VertexCount
Vertex count.
BoneId

Pointer to an array of values that identify each of the bones that can be drawn in a single drawing call. Note that the array can be of variable length to accommodate variable length bone combinations of ID3DXSkinInfo::ConvertToIndexedBlendedMesh.

The size of the array varies based on the type of mesh generated. A non-indexed mesh array size is equal to the number of weights per vertex (pMaxVertexInfl in ID3DXSkinInfo::ConvertToBlendedMesh). An indexed mesh array size is equal to the number of bone matrix palette entries (paletteSize in ID3DXSkinInfo::ConvertToIndexedBlendedMesh).

Remarks

The subset of the mesh described by D3DXBONECOMBINATION can be rendered in a single drawing call.

結(jié)構(gòu)體D3DXBONECOMBINATION用來(lái)描述網(wǎng)格中具有同樣屬性的部分,也就是網(wǎng)格模型的一個(gè)子集,這個(gè)網(wǎng)格模型子集也稱為屬性組。屬性組實(shí)際上是用來(lái)標(biāo)識(shí)網(wǎng)格模型中被指定的骨骼矩陣所影響的子網(wǎng)格,不同屬性組所標(biāo)識(shí)的子網(wǎng)格需要用不同的紋理、材質(zhì)進(jìn)行渲染,該子網(wǎng)格可以通過(guò)調(diào)用函數(shù)DrawIndexedPrimitive()或者DrawSubset()進(jìn)行繪制。

成員變量BoneId指向一個(gè)數(shù)組,該數(shù)組表示的是在單獨(dú)的一次繪制中,即一次DrawSubset()函數(shù)調(diào)用中所用到的全部骨骼矩陣,該數(shù)組的大小與將要生成的蒙皮網(wǎng)格類型有關(guān),在索引頂點(diǎn)混合蒙皮網(wǎng)格中,它的大小等于函數(shù)ConvertToIndexedBlendedMesh()中的輸入?yún)?shù)paletteSize,也就是結(jié)構(gòu)體D3DXMESHCONTAINER_DERIVEED的成員變量NumMatrixPalettes。變量NumMatrixPalettes表示進(jìn)行索引頂點(diǎn)混合時(shí)所需要的矩陣調(diào)色板的容量,它的數(shù)值需要根據(jù)硬件設(shè)備能力進(jìn)行相應(yīng)的設(shè)置。

 

cAllocateHierarchy類的設(shè)計(jì)實(shí)現(xiàn)

蒙皮骨骼動(dòng)畫網(wǎng)格模型接口中cAllocateHierarchy類和骨骼動(dòng)畫網(wǎng)格模型接口中的cAllocateHierarchy類基本相同,區(qū)別較大的是CreateMeshContainer()函數(shù)中增加了對(duì)蒙皮信息的處理:

// generate skin mesh
if(skin_info != NULL)
{
new_mesh_container->pSkinInfo = skin_info;
skin_info->AddRef();
	new_mesh_container->pOrgMesh = mesh_ptr;
mesh_ptr->AddRef();
	UINT num_bones = skin_info->GetNumBones();
new_mesh_container->ppBoneOffsetMatrices = new D3DXMATRIX*[num_bones];
	if(new_mesh_container->ppBoneOffsetMatrices == NULL)
{
DestroyMeshContainer(new_mesh_container);
return E_OUTOFMEMORY;
}
	for(UINT i = 0; i < num_bones; i++)
new_mesh_container->ppBoneOffsetMatrices[i] = new_mesh_container->pSkinInfo->GetBoneOffsetMatrix(i);
	hr = GenerateSkinnedMesh(new_mesh_container);
	if(FAILED(hr))
{
DestroyMeshContainer(new_mesh_container);
return hr;
}
}

CreateMeshContainer()函數(shù)中處理蒙皮信息的關(guān)鍵是調(diào)用自定義函數(shù)GenerateSkinnedMesh()來(lái)生成蒙皮網(wǎng)格模型,其定義如下:

HRESULT cAllocateHierarchy::GenerateSkinnedMesh(D3DXMESHCONTAINER_DERIVED* mesh_container)
{
    ID3DXSkinInfo
* skin_info = mesh_container->pSkinInfo;

    
if(skin_info == NULL)
        
return S_OK;

    release_com(mesh_container
->MeshData.pMesh);
    release_com(mesh_container
->pBoneCombBuffer);

    HRESULT hr;
    IDirect3DIndexBuffer9
* index_buffer;
    
    
if(FAILED(hr = mesh_container->pOrgMesh->GetIndexBuffer(&index_buffer)))
        
return hr;

    DWORD max_faces_infl_per_triangle;
    hr 
= skin_info->GetMaxFaceInfluences(index_buffer, mesh_container->pOrgMesh->GetNumFaces(), 
                                         
&max_faces_infl_per_triangle);

    index_buffer
->Release();

    
if(FAILED(hr))
        
return hr;

    max_faces_infl_per_triangle 
= min(max_faces_infl_per_triangle, 12);

    IDirect3DDevice9
* device = DXUTGetD3DDevice();

    D3DCAPS9 caps;
    device
->GetDeviceCaps(&caps);

    
if((caps.MaxVertexBlendMatrixIndex+1)/2 < max_faces_infl_per_triangle)
    {
        
// use software vertex processing
        mesh_container->NumMatrixPalettes = min(256, skin_info->GetNumBones());
        mesh_container
->UseSoftwareVP = true;
    }
    
else
    {
        
// use hardware verterx processing
        mesh_container->NumMatrixPalettes = min((caps.MaxVertexBlendMatrixIndex+1)/2, skin_info->GetNumBones());
        mesh_container
->UseSoftwareVP = false;
    }

    hr 
= skin_info->ConvertToIndexedBlendedMesh(mesh_container->pOrgMesh, 0, mesh_container->NumMatrixPalettes,
            mesh_container
->pAdjacency, NULL, NULL, NULL, &mesh_container->MaxBonesInflPerVertex,
            
&mesh_container->NumAttrGroups, &mesh_container->pBoneCombBuffer, &mesh_container->MeshData.pMesh);

    
return hr;
}

 

函數(shù)GenerateSkinnedMesh()判斷當(dāng)前網(wǎng)格容器是否包含蒙皮信息,如果當(dāng)前網(wǎng)格模型中不包含蒙皮信息,則直接退出該函數(shù)。接下來(lái)確定所需要的矩陣調(diào)色板的容量,最后調(diào)用函數(shù)ConvertToIndexedBlendedMesh()根據(jù)初始網(wǎng)格模型提供的相應(yīng)參數(shù)生成索引蒙皮網(wǎng)格模型。函數(shù)ConvertToIndexedBlendedMesh()的聲明如下:

Takes a mesh and returns a new mesh with per-vertex blend weights, indices, and a bone combination table. The table describes which bone palettes affect which subsets of the mesh.

HRESULT ConvertToIndexedBlendedMesh(
LPD3DXMESH pMesh,
DWORD Options,
DWORD paletteSize,
CONST DWORD * pAdjacencyIn,
LPDWORD pAdjacencyOut,
DWORD * pFaceRemap,
LPD3DXBUFFER * ppVertexRemap,
DWORD * pMaxVertexInfl,
DWORD * pNumBoneCombinations,
LPD3DXBUFFER * ppBoneCombinationTable,
LPD3DXMESH * ppMesh
);

Parameters

pMesh
[in] The input mesh.
Options
[in] Currently unused.
paletteSize
[in] Number of bone matrices available for matrix palette skinning.
pAdjacencyIn
[in] Input mesh adjacency information.
pAdjacencyOut
[in] Output mesh adjacency information.
pFaceRemap
[out] An array of DWORDs, one per face, that identifies the original mesh face that corresponds to each face in the blended mesh. If the value supplied for this argument is NULL, face remap data is not returned.
ppVertexRemap
[out] Address of a pointer to an ID3DXBuffer interface, which contains a DWORD for each vertex that specifies how the new vertices map to the old vertices. This remap is useful if you need to alter external data based on the new vertex mapping. This parameter is optional; NULL may be used.
pMaxVertexInfl
[out] Pointer to a DWORD that will contain the maximum number of bone influences required per vertex for this skinning method.
pNumBoneCombinations
[out] Pointer to the number of bones in the bone combination table.
ppBoneCombinationTable
[out] Pointer to the bone combination table. The data is organized in a D3DXBONECOMBINATION structure.
ppMesh
[out] Pointer to the new mesh.

Return Values

If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.

Remarks

Each element in the remap arrays specifies the previous index for that position. For example, if a vertex was in position 3 but has been remapped to position 5, then the fifth element of pVertexRemap will contain 3.

This method does not run on hardware that does not support fixed-function vertex blending.


posted on 2008-06-13 12:39 lovedday 閱讀(3296) 評(píng)論(2)  編輯 收藏 引用

評(píng)論

# re: 網(wǎng)格模型高級(jí)技術(shù)(17) 2009-05-30 15:55 拜讀者

你寫的內(nèi)容不錯(cuò),為什么不寫書出版呢?  回復(fù)  更多評(píng)論   

# re: 網(wǎng)格模型高級(jí)技術(shù)(17)[未登錄](méi) 2010-09-14 15:31 1

這些就是書上的內(nèi)容!  回復(fù)  更多評(píng)論   


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(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>
            午夜精品国产精品大乳美女| 中日韩视频在线观看| 久久国产精品久久久久久电车| 99国产精品| 国产精品大片免费观看| 亚洲欧美日韩国产一区二区三区| 一区二区动漫| 狠狠色狠狠色综合日日五| 美女日韩欧美| 欧美精品国产精品日韩精品| 一区二区三区高清在线观看| 亚洲少妇在线| 尤妮丝一区二区裸体视频| 亚洲国产精品一区| 国产精品久久久久9999吃药| 久久精品日产第一区二区| 欧美成人蜜桃| 欧美在线啊v一区| 裸体一区二区| 亚洲欧美国产制服动漫| 久久久999国产| 亚洲天堂成人在线视频| 欧美一区二区高清| 一本色道久久综合亚洲91| 亚洲欧美国产一区二区三区| 亚洲第一福利社区| 亚洲一区二区视频在线| 91久久精品国产91久久| 亚洲视频在线免费观看| 亚洲国产精品小视频| 一区二区三区产品免费精品久久75 | 亚洲欧美综合另类中字| 久久久久久国产精品mv| 中文日韩在线| 久久性色av| 久久黄金**| 欧美日韩在线一二三| 欧美第一黄网免费网站| 国产日韩精品在线播放| 亚洲最新在线视频| 91久久精品一区二区三区| 国产精品99久久99久久久二8| 韩国av一区| 夜夜嗨av一区二区三区网页| 怡红院精品视频| 一本一道久久综合狠狠老精东影业 | 蜜桃久久精品乱码一区二区| 亚洲视频一区| 久久久综合网| 午夜一区二区三区不卡视频| 免费看av成人| 麻豆精品一区二区av白丝在线| 国产精品久久网站| 99精品国产一区二区青青牛奶| 亚洲黄色在线观看| 老色鬼精品视频在线观看播放| 久久久无码精品亚洲日韩按摩| 国产精品久久国产三级国电话系列 | 欧美电影在线观看完整版| 国产一区二区三区四区老人| 亚洲欧美精品一区| 欧美一乱一性一交一视频| 国产精品毛片a∨一区二区三区|国 | 亚洲欧美成人一区二区在线电影| 99热这里只有精品8| 欧美精品v日韩精品v国产精品| 亚洲高清在线视频| 亚洲精品视频免费观看| 嫩草伊人久久精品少妇av杨幂| 欧美电影电视剧在线观看| 亚洲国产mv| 欧美国产日本高清在线| 亚洲清纯自拍| 久久久综合网| 欧美黄色大片网站| 99精品视频免费| 国产精品进线69影院| 亚洲一区综合| 久久综合色综合88| 亚洲九九精品| 国产精品日韩在线观看| 欧美一区二区三区在线| 久久综合久久综合九色| 亚洲级视频在线观看免费1级| 欧美精品观看| 亚洲欧美日韩综合aⅴ视频| 久久九九全国免费精品观看| 亚洲成人在线| 欧美特黄一级| 久久九九国产精品怡红院| 亚洲高清视频一区| 欧美亚洲一区二区在线| 在线成人小视频| 欧美美女福利视频| 小黄鸭精品密入口导航| 亚洲第一搞黄网站| 午夜精品久久久久久| 在线观看视频一区二区| 欧美日韩精品一区二区在线播放 | 久久一区欧美| 一区二区三区四区五区在线| 久久婷婷久久一区二区三区| 日韩视频一区二区| 国产一区二区三区在线观看精品| 久热精品视频在线观看| 一区二区三区四区五区精品| 久久av二区| 一区二区三区高清不卡| 狠狠入ady亚洲精品| 欧美日韩在线视频一区| 久久精品人人做人人爽电影蜜月| 亚洲美女视频在线观看| 美女脱光内衣内裤视频久久网站| 亚洲午夜精品久久| 亚洲韩国一区二区三区| 国产一区激情| 国产精品久久久久久久久久尿 | 欧美波霸影院| 欧美一级网站| 亚洲少妇一区| 夜色激情一区二区| 91久久在线播放| 农村妇女精品| 麻豆av福利av久久av| 欧美一区激情视频在线观看| 中国成人在线视频| 日韩天天综合| 99精品欧美一区| 亚洲精品一二三区| 亚洲日韩成人| 亚洲日本中文字幕| 亚洲欧洲日韩在线| 亚洲国产精品一区二区久| 国内精品国语自产拍在线观看| 欧美性一区二区| 欧美亚洲成人精品| 欧美日韩在线视频一区二区| 欧美精品xxxxbbbb| 欧美精品系列| 欧美日韩亚洲一区二区| 欧美电影免费观看| 欧美成人资源网| 欧美激情综合色| 欧美日本免费一区二区三区| 欧美激情一区二区三区在线| 欧美国产精品久久| 欧美日韩国产影院| 国产精品二区三区四区| 国产精品久久久久久久久久三级 | 亚洲欧美激情一区二区| 正在播放欧美一区| 亚洲一区二区三区免费视频| 亚洲性图久久| 欧美一区三区二区在线观看| 欧美一区二视频在线免费观看| 欧美一区三区二区在线观看| 久久久国产一区二区| 久久综合给合| 亚洲国产精品久久久久| av成人免费在线| 亚洲欧美在线播放| 美脚丝袜一区二区三区在线观看 | 亚洲欧美日韩国产另类专区| 欧美一级一区| 欧美多人爱爱视频网站| 国产精品大片wwwwww| 狠狠久久亚洲欧美| 99成人精品| 久久久精彩视频| 亚洲国产成人久久综合| 亚洲视频在线观看三级| 久久国产精品99精品国产| 欧美aⅴ99久久黑人专区| 国产精品精品视频| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲第一天堂无码专区| 亚洲一区二区高清视频| 久久免费黄色| 一区二区三区视频在线| 久久久久久久久久久一区| 欧美日韩在线观看一区二区| 国产三区精品| 亚洲四色影视在线观看| 蜜桃久久av一区| 亚洲免费视频中文字幕| 欧美激情国产高清| 黄色日韩网站| 午夜精品国产| 亚洲精品一区二区三区不| 久久精品免视看| 国产精品videosex极品| 亚洲国产专区校园欧美| 欧美资源在线观看| 亚洲伦理在线观看| 美女视频网站黄色亚洲| 国产永久精品大片wwwapp| 亚洲欧美日韩另类精品一区二区三区| 欧美成年人视频| 欧美在线国产| 国产一区二区久久久|