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

天行健 君子當(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>
            在线视频欧美日韩精品| 亚洲国产精品一区二区第四页av | 1024成人| 欧美国产在线视频| 欧美精品一区在线发布| 亚洲女性喷水在线观看一区| 亚洲一区二区精品在线观看| 国内精品福利| 亚洲国产裸拍裸体视频在线观看乱了| 欧美激情女人20p| 亚洲一区二区三区在线看| 亚洲宅男天堂在线观看无病毒| 国产一区激情| 亚洲黄色av一区| 国产精品久久久久久久久 | 亚洲国产精品123| 亚洲精品一区二区三区四区高清| 国产精品视频久久| 蜜臀va亚洲va欧美va天堂| 欧美日韩一区高清| 狼人社综合社区| 欧美新色视频| 欧美激情无毛| 国产一区在线播放| 亚洲人成网站影音先锋播放| 亚洲理论在线| 国内久久精品| 亚洲午夜一区| 亚洲美女电影在线| 欧美在线免费观看| 亚洲性感激情| 欧美电影免费观看高清| 性欧美xxxx大乳国产app| 久久亚洲视频| 久久精品国产清高在天天线 | 美日韩精品免费观看视频| 亚洲一区国产一区| 欧美jizz19hd性欧美| 久久黄色级2电影| 欧美日韩极品在线观看一区| 免费h精品视频在线播放| 国产精品美女一区二区| 欧美激情女人20p| 国产女主播一区二区| 日韩一级黄色大片| 亚洲第一天堂无码专区| 午夜精品一区二区三区在线视 | 樱桃视频在线观看一区| 校园春色综合网| 亚洲女性裸体视频| 国产精品av一区二区| 亚洲人体影院| 日韩一级片网址| 欧美精品999| 亚洲精品少妇| 99精品视频网| 欧美日韩在线免费| 夜夜爽夜夜爽精品视频| 亚洲视频狠狠| 国产精品美女久久久久久久| 亚洲少妇在线| 久久久之久亚州精品露出| 久久免费视频在线观看| 国产一区视频在线观看免费| 欧美在线亚洲一区| 久久免费99精品久久久久久| 国产综合色产在线精品| 久久成人资源| 欧美成人精品福利| 亚洲七七久久综合桃花剧情介绍| 久久夜色撩人精品| 亚洲国产精品一区二区久| 夜夜嗨av一区二区三区四季av| 欧美日韩国产精品一区| 亚洲深夜福利| 久久人人爽国产| 亚洲日本成人| 欧美三级乱码| 欧美中文在线观看国产| 欧美激情一级片一区二区| 在线一区观看| 国产乱子伦一区二区三区国色天香| 性亚洲最疯狂xxxx高清| 欧美mv日韩mv国产网站app| 亚洲精品视频免费观看| 国产精品男人爽免费视频1| 欧美一区亚洲| 亚洲国产美女精品久久久久∴| 亚洲图片在线| 黄色精品网站| 欧美日韩在线视频观看| 久久精品日产第一区二区三区| 亚洲电影在线看| 午夜精品久久久久久久蜜桃app | 老巨人导航500精品| 日韩视频在线一区二区三区| 国产精品日韩欧美| 久久人人爽人人爽| 在线综合+亚洲+欧美中文字幕| 久久亚洲不卡| 亚洲一区二区日本| 亚洲成色精品| 国产精品视频一区二区三区| 免费久久99精品国产自在现线| 一区二区日韩精品| 免费一级欧美在线大片| 午夜免费电影一区在线观看| 亚洲国产精品激情在线观看| 国产精品入口夜色视频大尺度 | 久久精品91| av成人老司机| 欧美激情精品久久久久久蜜臀| 欧美一区深夜视频| 9l视频自拍蝌蚪9l视频成人| 在线成人av| 国产一区二区电影在线观看| 欧美色另类天堂2015| 欧美mv日韩mv国产网站| 久久九九久精品国产免费直播| 亚洲午夜av在线| 亚洲裸体俱乐部裸体舞表演av| 欧美www在线| 久久婷婷国产综合精品青草| 久久超碰97人人做人人爱| 亚洲一区三区在线观看| 一二美女精品欧洲| 亚洲精品国产精品乱码不99| 亚洲国产合集| 亚洲福利在线观看| 在线观看视频免费一区二区三区| 国产日韩精品视频一区| 国产精品女主播| 欧美视频免费在线| 欧美日韩一区二区三区在线视频| 欧美精品一区二| 欧美成人久久| 欧美国产日韩精品免费观看| 欧美黄网免费在线观看| 欧美极品aⅴ影院| 欧美精选一区| 欧美日韩一区二区三区| 欧美视频在线免费| 国产精品久久久免费 | 久久综合电影| 免费人成精品欧美精品| 男女激情久久| 欧美日韩国产一中文字不卡| 欧美日一区二区三区在线观看国产免| 久久亚洲免费| 老司机免费视频久久| 亚洲成色精品| 日韩视频一区二区| 亚洲尤物影院| 久久免费少妇高潮久久精品99| 蜜桃视频一区| 欧美人牲a欧美精品| 欧美日韩专区在线| 国产日韩视频| 亚洲激情av| 国产精品99久久久久久有的能看| 亚洲欧美日韩另类精品一区二区三区| 欧美淫片网站| 欧美国产国产综合| avtt综合网| 久久精品一区二区国产| 欧美精品一区二区三区四区| 国产精品免费电影| 在线精品视频一区二区| 一区二区三区精品在线| 久久国产精彩视频| 欧美福利电影在线观看| 亚洲天堂av在线免费| 久久综合狠狠综合久久综青草| 欧美日韩视频专区在线播放| 国产亚洲午夜高清国产拍精品| 亚洲日本va午夜在线影院| 亚洲欧美另类在线| 欧美高清一区二区| 亚洲在线观看| 欧美激情一区二区久久久| 国产一区二区精品| 一区二区三区成人精品| 狂野欧美激情性xxxx| 亚洲私人黄色宅男| 欧美1区2区3区| 国产午夜精品理论片a级大结局| 一本到高清视频免费精品| 免费欧美电影| 亚洲在线视频| 欧美日韩国产精品成人| 亚洲国产综合在线| 久久人人97超碰精品888| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲精品老司机| 久久精品91久久香蕉加勒比| 国产精品久久久久久亚洲毛片| 亚洲精品视频免费观看| 免费不卡在线观看| 欧美有码在线观看视频| 国产视频一区免费看|