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

天行健 君子當(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)格模型保存下來,這就是pOrgMesh的作用。變量MaxBonesInflPerVertex表示每個(gè)頂點(diǎn)最多受多少骨骼的影響,指針變量pBoneCombBuffer指向骨骼結(jié)合表,骨骼結(jié)合表中的數(shù)據(jù)按屬性組結(jié)構(gòu)體D3DXBONECOMBINATION組織起來,該結(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用來描述網(wǎng)格中具有同樣屬性的部分,也就是網(wǎng)格模型的一個(gè)子集,這個(gè)網(wǎng)格模型子集也稱為屬性組。屬性組實(shí)際上是用來標(biāo)識(shí)網(wǎng)格模型中被指定的骨骼矩陣所影響的子網(wǎng)格,不同屬性組所標(biāo)識(shí)的子網(wǎng)格需要用不同的紋理、材質(zhì)進(jìn)行渲染,該子網(wǎng)格可以通過調(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()來生成蒙皮網(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ù)。接下來確定所需要的矩陣調(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 閱讀(3307) 評(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)[未登錄] 2010-09-14 15:31 1

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


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   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>
            黄色av日韩| 一本色道**综合亚洲精品蜜桃冫| 亚洲午夜激情网页| 亚洲一区二区三区精品视频 | 欧美日韩精品久久久| 欧美激情一区二区三区高清视频 | 欧美3dxxxxhd| 欧美午夜宅男影院| 狠狠爱www人成狠狠爱综合网| 久久精品免费观看| 亚洲国产日韩综合一区| 在线精品国产欧美| 一区二区三区精品视频在线观看| 亚洲伊人伊色伊影伊综合网 | 亚洲午夜免费福利视频| 宅男噜噜噜66国产日韩在线观看| 久久午夜影视| 国产精品国产亚洲精品看不卡15| 在线播放日韩欧美| 性欧美精品高清| 亚洲福利视频网站| 久久国产66| 国产精品盗摄久久久| 久久久www成人免费精品| 日韩视频三区| 免费观看成人| 午夜视频在线观看一区二区| 亚洲精品日韩欧美| 欧美h视频在线| 午夜精彩视频在线观看不卡| 久久精品人人爽| 国产亚洲福利一区| 亚洲欧美国产精品桃花| 亚洲精品美女免费| 欧美精品啪啪| 久久综合色播五月| 欧美一级片久久久久久久| 国产精品久久网站| 亚洲欧美日韩人成在线播放| 久久香蕉国产线看观看网| 一区二区三区精品在线| 久久久久久97三级| 亚洲第一天堂av| 亚洲欧美综合精品久久成人| 国产精品有限公司| 久久久国产一区二区| 欧美日韩美女| 亚洲视频国产视频| 一区二区三区四区在线| 亚洲国产小视频| 亚洲欧洲在线看| 欧美日韩视频免费播放| 欧美sm视频| 免费观看一级特黄欧美大片| 欧美有码视频| 免费不卡亚洲欧美| 一个人看的www久久| 99国产精品久久久久久久| 国产精品久久久久久亚洲毛片| 欧美激情一区在线| 欧美日韩视频一区二区三区| 亚洲电影免费观看高清完整版| 国内精品视频666| 亚洲欧洲日产国产综合网| 亚洲高清视频的网址| 99热这里只有精品8| 9久草视频在线视频精品| 欧美1区视频| 亚洲日本成人| 日韩一级成人av| 亚洲免费在线观看| 影音先锋日韩资源| 美女91精品| 欧美激情综合色| 日韩视频免费观看| 香蕉成人伊视频在线观看| 亚洲国产精品欧美一二99| 久久网站免费| 亚洲黄一区二区三区| 夜夜爽www精品| 国产精品久在线观看| 亚洲欧美日韩国产一区二区三区| 久久福利毛片| 欧美日韩在线观看视频| 一区二区三区成人| 久久大逼视频| 悠悠资源网亚洲青| 欧美搞黄网站| 另类尿喷潮videofree| 1024亚洲| 欧美午夜片在线免费观看| 亚洲一区中文字幕在线观看| 99国产精品久久久久久久久久| 欧美日韩免费观看一区=区三区| 一区二区三区欧美激情| 久久精品国产一区二区电影| 亚洲国产电影| 国产精品久久久99| 久久精品伊人| 亚洲免费黄色| 久久亚洲春色中文字幕久久久| 国产精品爽爽ⅴa在线观看| 亚洲高清在线视频| 亚洲欧美日韩在线不卡| 一区二区三区在线免费观看| 欧美亚洲在线播放| 亚洲国产精品电影在线观看| 亚洲免费一区二区| 亚洲黄色在线| 国产亚洲综合在线| 欧美日韩亚洲一区二区三区| 欧美在线啊v| 久久人人97超碰精品888| 国产女主播一区| 亚洲欧美激情视频在线观看一区二区三区 | 欧美日本韩国在线| 亚洲精品久久久蜜桃| 久久国产精品久久久久久电车| 91久久精品视频| 欧美精品亚洲精品| 欧美在线国产精品| 国产精品99久久久久久人| 欧美xx69| 美女久久网站| 亚洲国产成人av| 国产日韩综合| 久久欧美肥婆一二区| 午夜伦欧美伦电影理论片| 亚洲九九九在线观看| 欧美国产另类| 亚洲毛片在线| 亚洲国产日日夜夜| 好看的亚洲午夜视频在线| 国产精品爽黄69| 国产精品久久毛片a| 欧美日本一区二区高清播放视频| 久久蜜臀精品av| 久久精品二区三区| 欧美一区二区免费| 亚洲欧美激情精品一区二区| 9色国产精品| 9久re热视频在线精品| 亚洲人成网在线播放| 亚洲高清影视| 亚洲国产三级| 亚洲人在线视频| 99日韩精品| 亚洲视频精品| 小嫩嫩精品导航| 久久大逼视频| 另类亚洲自拍| 亚洲影院色在线观看免费| 在线视频中文亚洲| 亚洲欧洲av一区二区三区久久| 亚洲男女毛片无遮挡| 性欧美大战久久久久久久久| 亚洲欧美日韩在线一区| 亚洲欧美日韩另类| 欧美在线观看一区二区三区| 久久激情网站| 欧美大秀在线观看| 欧美一区国产在线| 久久婷婷人人澡人人喊人人爽| 久久这里只有精品视频首页| 欧美风情在线观看| 欧美午夜宅男影院在线观看| 国产日韩欧美制服另类| 在线成人中文字幕| 亚洲手机在线| 久久久久久久一区| 亚洲国产高清自拍| 一区二区三区视频在线观看| 欧美一级午夜免费电影| 美女日韩在线中文字幕| 欧美日韩国产综合在线| 国产私拍一区| 亚洲每日更新| 久久久久9999亚洲精品| 亚洲高清免费| 西西裸体人体做爰大胆久久久| 免费成人美女女| 国产精品爱久久久久久久| 国外成人在线视频网站| 日韩视频二区| 久久视频一区| 亚洲调教视频在线观看| 亚洲精品久久久久久下一站| 亚洲综合日韩| 欧美激情按摩| 黑丝一区二区| 亚洲欧美日韩在线高清直播| 欧美成人激情视频免费观看| 亚洲一区二区三区免费观看 | 欧美资源在线观看| 欧美激情一区| 激情久久一区| 欧美综合第一页| 宅男噜噜噜66国产日韩在线观看| 久久免费观看视频| 国产精品综合久久久|