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

天行健 君子當(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>
            国产三区精品| 欧美中文字幕不卡| 欧美极品色图| 日韩午夜激情电影| 一本久道综合久久精品| 国产精品久久久久久模特| 亚洲欧美国产另类| 午夜一区二区三区不卡视频| 国产一区二区三区成人欧美日韩在线观看| 欧美影院在线播放| 久久综合狠狠综合久久综合88| 亚洲黄色毛片| 在线亚洲伦理| 国内精品伊人久久久久av一坑| 欧美高清在线| 欧美性生交xxxxx久久久| 久久久夜精品| 欧美精品日韩www.p站| 亚久久调教视频| 久久夜色精品国产噜噜av| 亚洲免费成人av| 午夜一级久久| 日韩一级黄色大片| 久久高清国产| 中文精品在线| 久久天天狠狠| 先锋影院在线亚洲| 欧美大香线蕉线伊人久久国产精品| 亚洲一区二区三区精品在线观看| 久久精品夜色噜噜亚洲aⅴ| 亚洲视频一区二区在线观看| 欧美一区视频在线| 亚洲少妇在线| 欧美成人dvd在线视频| 久久久久久黄| 国产精品乱人伦一区二区| 亚洲国产精品传媒在线观看| 国产免费亚洲高清| 夜夜嗨av一区二区三区四区| 在线观看免费视频综合| 亚洲欧美激情一区| 99精品欧美一区二区三区综合在线 | 激情自拍一区| 亚洲永久在线| 中日韩美女免费视频网址在线观看 | 亚洲另类春色国产| 亚洲国产高清一区二区三区| 午夜一级在线看亚洲| 亚洲影院免费| 欧美日韩在线观看一区二区| 欧美高清你懂得| 在线精品福利| 久久激五月天综合精品| 久久精品成人一区二区三区| 欧美午夜宅男影院| 一区二区三区**美女毛片| 日韩视频免费观看| 欧美国内亚洲| 亚洲区欧美区| 在线午夜精品| 欧美色视频在线| aa成人免费视频| 亚洲女爱视频在线| 国产精品一区二区你懂的| 亚洲一区欧美| 久久成人羞羞网站| 国产一区欧美日韩| 久久精品国产久精国产思思| 久久久久久网| 在线免费日韩片| 欧美91福利在线观看| 亚洲电影免费在线观看| 99精品99久久久久久宅男| 欧美精品日韩| 亚洲天堂免费观看| 久久成人免费电影| 影音先锋中文字幕一区| 欧美成人精品1314www| 亚洲日本成人| 性xx色xx综合久久久xx| 国产日韩一区欧美| 美女脱光内衣内裤视频久久网站| 亚洲电影在线观看| 亚洲一区在线观看免费观看电影高清| 欧美午夜不卡在线观看免费| 亚洲欧美不卡| 欧美成人激情视频免费观看| 亚洲精品中文字幕在线观看| 国产精品www994| 久久精彩视频| 亚洲精品在线观看视频| 午夜日韩电影| 亚洲激情视频在线播放| 欧美婷婷久久| 久久人91精品久久久久久不卡| 亚洲欧洲久久| 久久久噜噜噜| 亚洲素人一区二区| 伊人精品成人久久综合软件| 欧美精品综合| 久久精品国产亚洲a| 亚洲另类在线一区| 久久欧美中文字幕| 一本一道久久综合狠狠老精东影业| 国产精品日本一区二区| 蜜臀久久99精品久久久久久9| 一本综合精品| 亚洲国产精品电影| 久久精品人人做人人爽电影蜜月| 亚洲精品一区二区三区福利| 国产区精品在线观看| 欧美电影免费网站| 久久国产精品一区二区三区| 99精品国产在热久久| 欧美不卡视频一区发布| 欧美一区二区三区精品电影| 亚洲欧洲综合另类| 韩国精品主播一区二区在线观看| 欧美日韩在线亚洲一区蜜芽| 另类天堂av| 欧美专区一区二区三区| 中国成人黄色视屏| 亚洲欧洲日本国产| 欧美大尺度在线| 久久亚洲精品中文字幕冲田杏梨| 亚洲自拍偷拍麻豆| av72成人在线| 亚洲三级电影全部在线观看高清| 国产综合色在线视频区| 国产精品婷婷| 国产精品拍天天在线| 欧美日韩另类综合| 欧美日本高清| 欧美福利视频在线观看| 久久亚洲欧洲| 乱人伦精品视频在线观看| 久久久久久久久久码影片| 欧美一级久久久久久久大片| 亚洲综合精品一区二区| 一区二区欧美日韩视频| 亚洲免费激情| 一区二区日韩| 亚洲女性裸体视频| 亚洲欧美国产毛片在线| 亚洲欧美文学| 欧美一区二区三区免费视| 欧美一级黄色网| 欧美在线精品免播放器视频| 久久大综合网| 久色成人在线| 欧美精品国产精品| 欧美日韩在线免费视频| 国产精品乱子久久久久| 国产日韩欧美在线视频观看| 国产一区二区三区四区老人| 影音欧美亚洲| 亚洲精品视频一区| 亚洲自拍16p| 久久久久久久久久久一区| 免费观看成人www动漫视频| 亚洲第一精品夜夜躁人人躁| 亚洲三级色网| 亚洲一区高清| 久久夜色精品国产| 欧美日韩免费一区二区三区视频| 国产精品美女久久久浪潮软件 | 在线观看欧美亚洲| 亚洲精品国产精品国产自| 在线中文字幕一区| 午夜天堂精品久久久久| 鲁大师成人一区二区三区| 亚洲欧洲一区二区三区| 亚洲影音一区| 麻豆av福利av久久av| 欧美私人网站| 亚洲国产欧美在线人成| 亚洲一区二区日本| 久久综合久色欧美综合狠狠| 亚洲国产欧美不卡在线观看| 亚洲一区美女视频在线观看免费| 久久久精品国产免大香伊| 欧美精品成人91久久久久久久| 国产精品丝袜白浆摸在线| 亚洲高清视频在线观看| 午夜激情久久久| 亚洲激情在线观看视频免费| 午夜亚洲影视| 欧美午夜久久| 亚洲精品国精品久久99热一| 久久精品国产亚洲一区二区| 亚洲欧洲日产国产综合网| 欧美在线不卡| 国产精品美腿一区在线看| 亚洲区一区二区三区| 久久久精品久久久久| 一区二区三区|亚洲午夜| 欧美电影在线观看完整版| 黄色工厂这里只有精品| 先锋影音一区二区三区| 日韩小视频在线观看|