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

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

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

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

 

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

為了在網(wǎng)格模型中包含蒙皮信息,需要進(jìn)一步擴展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)格模型并由此生成一個蒙皮網(wǎng)格時,會用D3DXMESHCONTAINER::MeshData::pMesh存儲所生成的蒙皮網(wǎng)格模型,這時需要將初始網(wǎng)格模型保存下來,這就是pOrgMesh的作用。變量MaxBonesInflPerVertex表示每個頂點最多受多少骨骼的影響,指針變量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)格模型的一個子集,這個網(wǎng)格模型子集也稱為屬性組。屬性組實際上是用來標(biāo)識網(wǎng)格模型中被指定的骨骼矩陣所影響的子網(wǎng)格,不同屬性組所標(biāo)識的子網(wǎng)格需要用不同的紋理、材質(zhì)進(jìn)行渲染,該子網(wǎng)格可以通過調(diào)用函數(shù)DrawIndexedPrimitive()或者DrawSubset()進(jìn)行繪制。

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

 

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

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

// 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 閱讀(3312) 評論(2)  編輯 收藏 引用

評論

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

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

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

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


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


公告

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類(178)

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

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            麻豆免费精品视频| 欧美成人午夜免费视在线看片| 欧美日本一区二区三区| 亚洲精品国产无天堂网2021| 美女视频黄免费的久久| 久久婷婷国产综合国色天香| 一区视频在线播放| 亚洲成色777777女色窝| 欧美国产精品久久| 亚洲毛片网站| 这里只有精品在线播放| 国产精品视频福利| 久久色中文字幕| 乱码第一页成人| 夜夜嗨av一区二区三区网页| 一区二区三区日韩在线观看| 国产精品日日摸夜夜摸av| 久久精品首页| 欧美日本不卡高清| 欧美一区二区三区婷婷月色| 久久激情综合| 一区二区日韩欧美| 欧美一区免费视频| 亚洲欧洲一区二区在线播放| 一本久久知道综合久久| 国产一区二区三区免费不卡| 亚洲大片在线| 国产精品一区二区女厕厕| 免费一级欧美片在线播放| 欧美日韩国语| 久久美女性网| 国产精品国产三级国产| 久久一区二区三区av| 欧美人与性动交a欧美精品| 欧美在线观看视频一区二区三区| 久热精品在线视频| 亚洲永久精品大片| 美女主播精品视频一二三四| 亚洲综合精品一区二区| 另类尿喷潮videofree| 亚洲在线播放| 欧美成人在线免费视频| 久久www免费人成看片高清| 欧美成人一区二区三区片免费| 香蕉久久夜色精品国产| 欧美激情中文不卡| 麻豆成人精品| 国产亚洲综合性久久久影院| 99国产欧美久久久精品| 亚洲国产片色| 久久精品免费看| 欧美一区二区三区视频| 欧美午夜美女看片| 亚洲第一精品夜夜躁人人躁| 很黄很黄激情成人| 亚洲欧美怡红院| 亚洲欧美成人一区二区三区| 欧美老女人xx| 亚洲福利视频二区| 亚洲国产精品黑人久久久| 久久精品亚洲一区二区| 欧美影院成人| 国产农村妇女精品一二区| 一本色道久久99精品综合| 夜夜嗨一区二区三区| 欧美成人在线免费观看| 亚洲承认在线| 亚洲精品黄网在线观看| 欧美福利视频| 亚洲狠狠丁香婷婷综合久久久| 亚洲国产精品激情在线观看| 久久亚洲图片| 亚洲第一精品夜夜躁人人爽| 亚洲精品久久久一区二区三区| 美国十次成人| 亚洲人体偷拍| 亚洲一线二线三线久久久| 国产精品红桃| 午夜精品影院| 久久综合伊人77777尤物| 在线看欧美视频| 欧美国产在线视频| 99国产精品视频免费观看| 亚洲欧美激情在线视频| 国产日韩精品一区二区三区| 欧美一区在线直播| 女同性一区二区三区人了人一| 亚洲人成网站精品片在线观看| 欧美激情久久久久久| 一本到12不卡视频在线dvd| 亚洲欧美日韩天堂| 国模精品娜娜一二三区| 欧美va亚洲va国产综合| 日韩视频在线免费观看| 性欧美18~19sex高清播放| 国产亚洲综合精品| 欧美成人精品激情在线观看| 一区二区三区精品视频| 久久人人爽国产| 99精品国产热久久91蜜凸| 国产精品丝袜久久久久久app | 精品电影在线观看| 久久影院午夜论| 一区二区欧美视频| 久久天天躁狠狠躁夜夜av| 亚洲精品网站在线播放gif| 国产精品美女xx| 久久中文字幕导航| 亚洲图片欧美一区| 欧美第一黄色网| 欧美一区二区福利在线| 亚洲激情在线观看| 国产日韩成人精品| 欧美护士18xxxxhd| 欧美一区二区三区另类| 亚洲精品一区二区三区福利| 久久成人一区二区| 一本色道久久综合狠狠躁篇的优点| 国产亚洲午夜高清国产拍精品| 欧美精品粉嫩高潮一区二区 | 久久久另类综合| 亚洲少妇自拍| 亚洲国产一区二区三区在线播| 久久岛国电影| 亚洲欧美日韩第一区 | 欧美日韩成人综合天天影院| 午夜精品免费| 一区二区福利| 亚洲国产综合视频在线观看| 久久野战av| 久久国产精品99国产| 亚洲午夜小视频| 一本色道久久综合| 亚洲老司机av| 最新国产成人av网站网址麻豆| 国内精品久久久| 国产亚洲永久域名| 国产欧美精品一区aⅴ影院| 欧美吻胸吃奶大尺度电影| 欧美精品成人一区二区在线观看| 久久全国免费视频| 久久久亚洲成人| 另类av一区二区| 免费看精品久久片| 欧美xart系列高清| 欧美激情欧美狂野欧美精品| 欧美大片专区| 欧美顶级少妇做爰| 欧美第一黄色网| 欧美日韩国产欧| 欧美三级视频| 国产精品国产成人国产三级| 欧美体内谢she精2性欧美| 欧美三级在线视频| 国产精品视频久久久| 国产区亚洲区欧美区| 国产一区二区三区四区| 精品二区久久| 亚洲精品日韩久久| 亚洲视频久久| 久久精品国产久精国产思思| 久久国产欧美| 欧美国产精品专区| 亚洲精品乱码久久久久久按摩观| 亚洲最新在线| 亚洲欧美一区二区视频| 久久国产视频网站| 免费观看久久久4p| 国产精品不卡在线| 国产三级精品在线不卡| 亚洲国产成人av好男人在线观看| 亚洲毛片在线免费观看| 亚洲在线视频免费观看| 欧美专区在线| 91久久久一线二线三线品牌| 99精品国产在热久久| 欧美一区二区三区日韩| 欧美1区2区| 国产精品毛片| 亚洲成色777777在线观看影院| 一本色道久久综合狠狠躁篇的优点| 午夜精品影院在线观看| 男女精品网站| 亚洲一区二区精品视频| 美女黄毛**国产精品啪啪| 国产精品九九| 亚洲国产成人精品女人久久久| 亚洲一区bb| 亚洲大片在线| 欧美一区二区三区精品电影| 欧美精品一区二区高清在线观看| 国产伦精品一区二区三区在线观看| 亚洲国产99| 久久av老司机精品网站导航| 亚洲人成在线播放| 久久国产精品电影| 国产精品国产三级国产专播精品人 | 欧美精品成人一区二区在线观看 | 国产精品久99| 亚洲精品免费在线播放|