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

天行健 君子當(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>
            亚洲自拍另类| 伊人久久大香线蕉综合热线| 欧美激情一区二区三级高清视频| 久热精品视频在线观看| 美女主播精品视频一二三四| 欧美日韩国产123| 国产精品自在欧美一区| 国语自产精品视频在线看一大j8| 亚洲国产一区二区精品专区| 亚洲一区二区三区在线播放| 久久成人羞羞网站| 欧美成人免费大片| 中文av一区二区| 久久久久国产免费免费| 欧美午夜精品| 亚洲国产中文字幕在线观看| 亚洲欧洲日本专区| 性感少妇一区| 亚洲狠狠婷婷| 久久人人超碰| 国产字幕视频一区二区| 亚洲免费在线| 99在线观看免费视频精品观看| 久久激五月天综合精品| 国产精品国色综合久久| 中文亚洲字幕| 亚洲日本电影在线| 免费在线观看一区二区| 韩国一区电影| 一本色道久久综合精品竹菊| 欧美日本一区| 艳女tv在线观看国产一区| 免费亚洲电影在线| 久久精品国产免费| 亚洲视频第一页| 久久久五月婷婷| 午夜精品免费视频| 亚洲欧美一区二区三区在线 | 亚洲欧美电影院| 久久亚洲图片| 欧美一区二区三区婷婷月色| 正在播放日韩| 亚洲精品欧美一区二区三区| 欧美黑人在线播放| 欧美 日韩 国产一区二区在线视频 | 亚洲永久免费观看| 国产目拍亚洲精品99久久精品| 欧美福利精品| 狠狠久久综合婷婷不卡| 亚洲一区二区三区欧美| 亚洲欧洲视频在线| 亚洲蜜桃精久久久久久久| 欧美日韩一区二区三区视频| 亚洲视频你懂的| 女人香蕉久久**毛片精品| 免费成人高清| 一区二区视频欧美| 亚洲国产欧美国产综合一区| 在线观看国产日韩| 久久精品一二三区| 亚洲精品在线看| 亚洲视频播放| 亚洲视频免费| 国产精品va在线播放| 亚洲精品视频中文字幕| 国产日韩欧美在线一区| 免费一级欧美片在线观看| 狠狠v欧美v日韩v亚洲ⅴ| 欧美一区二区播放| 亚洲免费精彩视频| 欧美精品 国产精品| 亚洲国产99| 国产精品狼人久久影院观看方式| 久久久久国产精品厨房| 免费欧美电影| 亚洲国内精品在线| 一区二区三区日韩精品| 久久国产日韩| 欧美黄色小视频| 亚洲乱码精品一二三四区日韩在线 | 欧美国产日韩视频| 99成人在线| 久久男人资源视频| 欧美国产高潮xxxx1819| 日韩视频永久免费| 欧美香蕉视频| 欧美亚洲视频在线看网址| 免费试看一区| 国产精品99久久久久久有的能看| 国产精品久久久久久超碰| 欧美在线|欧美| 亚洲欧美日韩高清| 国产亚洲日本欧美韩国| 一区二区三区免费看| 久久久久99精品国产片| 亚洲国产日韩欧美在线动漫| 欧美特黄一区| 日韩天堂在线视频| 欧美一区二区三区在线观看视频| 在线精品亚洲| 久久久久免费观看| 99国产精品久久久久老师| 欧美在线|欧美| 亚洲精品男同| 国产亚洲精品久久久| 欧美激情一区在线| 久久精品国产久精国产爱 | 亚洲一区二区高清视频| 国产精品女同互慰在线看| 久久综合色影院| 亚洲一区二区在线| 亚洲国产成人精品久久| 久久av免费一区| 99re这里只有精品6| 狠狠久久亚洲欧美| 国产精品性做久久久久久| 亚洲天堂久久| 久久精品国产免费看久久精品| 国产日韩欧美一区二区三区在线观看 | 午夜精品福利在线观看| 91久久精品美女高潮| 久久久天天操| 一区二区三区亚洲| 国产毛片一区二区| 欧美日韩一区不卡| 麻豆成人av| 久久精品国产久精国产一老狼 | 免播放器亚洲| 欧美一区午夜精品| 亚洲一区二区三区中文字幕| 亚洲人成网在线播放| 在线观看欧美精品| 国产在线播精品第三| 国产亚洲a∨片在线观看| 国产精品第一区| 欧美日韩直播| 欧美日韩在线高清| 欧美日韩午夜在线| 欧美日韩国产影院| 欧美日韩中文字幕| 欧美视频在线一区| 国产精品国产三级国产aⅴ入口| 欧美日韩国产色综合一二三四| 久久综合五月| 免费在线视频一区| 欧美黄色aaaa| 亚洲尤物在线| 亚洲综合电影一区二区三区| 亚洲一区二区三区四区视频| 亚洲图片自拍偷拍| 亚洲一区欧美| 欧美中文在线免费| 久久夜色精品| 欧美国产第二页| 欧美日韩精品| 国产欧美日韩一区二区三区| 欧美黄色小视频| 欧美日韩精品一区| 国产精品久在线观看| 国产日韩一区二区三区| 国内精品久久久久久影视8| 国内成人自拍视频| 91久久精品国产91性色| 中国女人久久久| 欧美专区第一页| 免费看黄裸体一级大秀欧美| 亚洲人被黑人高潮完整版| 一片黄亚洲嫩模| 欧美亚洲视频| 欧美精品久久久久久久免费观看| 欧美天天在线| 好看的亚洲午夜视频在线| 亚洲人精品午夜| 午夜在线一区| 欧美成人一品| 9色porny自拍视频一区二区| 欧美一区激情| 欧美人与性动交cc0o| 国产精品区一区二区三| 在线精品视频免费观看| 亚洲在线观看视频网站| 一级成人国产| 久久综合伊人77777蜜臀| 欧美一区在线视频| 亚洲国产91| 亚洲欧美色一区| 欧美日韩p片| 激情综合久久| 欧美一区二区网站| 亚洲日本va午夜在线影院| 欧美一级视频精品观看| 欧美日韩国产小视频在线观看| 国产亚洲电影| 亚洲午夜激情网页| 亚洲电影在线看| 久久精品国产亚洲5555| 国产精品毛片在线| 亚洲美女毛片| 欧美高清视频在线 | 亚洲国产成人在线视频|