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

天行健 君子當自強而不息

DXUT源碼分析 ---- 類CDXUTMesh(3)

接下來的Create()函數從接口ID3DXFileData創建網格模型:

HRESULT CDXUTMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice, LPD3DXFILEDATA pFileData )
{
    LPD3DXBUFFER pMtrlBuffer 
= NULL;
    LPD3DXBUFFER pAdjacencyBuffer 
= NULL;
    HRESULT      hr;

    
// Cleanup previous mesh if any
    Destroy();

    
// Load the mesh from the DXFILEDATA object
    if( FAILED( hr = D3DXLoadMeshFromXof( pFileData, D3DXMESH_MANAGED, pd3dDevice, &pAdjacencyBuffer, &pMtrlBuffer, 
                                          NULL, 
&m_dwNumMaterials, &m_pMesh ) ) )
    {
        
return hr;
    }

    
// Optimize the mesh for performance
    if( FAILED( hr = m_pMesh->OptimizeInplace(
                        D3DXMESHOPT_COMPACT 
| D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE,
                        (DWORD
*)pAdjacencyBuffer->GetBufferPointer(), NULL, NULL, NULL ) ) )
    {
        SAFE_RELEASE( pAdjacencyBuffer );
        SAFE_RELEASE( pMtrlBuffer );
        
return hr;
    }

    D3DXMATERIAL
* d3dxMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer();
    hr 
= CreateMaterials( L"", pd3dDevice, d3dxMtrls, m_dwNumMaterials );

    SAFE_RELEASE( pAdjacencyBuffer );
    SAFE_RELEASE( pMtrlBuffer );

    
// Extract data from m_pMesh for easy access
    D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE];

    m_dwNumVertices    
= m_pMesh->GetNumVertices();
    m_dwNumFaces       
= m_pMesh->GetNumFaces();
    m_dwBytesPerVertex 
= m_pMesh->GetNumBytesPerVertex();

    m_pMesh
->GetIndexBuffer( &m_pIB );
    m_pMesh
->GetVertexBuffer( &m_pVB );
    m_pMesh
->GetDeclaration( decl );

    pd3dDevice
->CreateVertexDeclaration( decl, &m_pDecl );

    
return hr;
}

 

該函數與上一個Create()函數并無太大區別,只是在加載網格模型時調用D3DXLoadMeshFromXof()而不是D3DXLoadMeshFromXW()。

 

最后一個Create()函數從輸入的網格模型中創建新的網格模型:

HRESULT CDXUTMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice, ID3DXMesh* pInMesh, 
                           D3DXMATERIAL
* pd3dxMaterials, DWORD dwMaterials )
{
    
// Cleanup previous mesh if any
    Destroy();

    
// Optimize the mesh for performance

    DWORD 
*rgdwAdjacency = NULL;

    rgdwAdjacency 
= new DWORD[pInMesh->GetNumFaces() * 3];
    
if( rgdwAdjacency == NULL )
        
return E_OUTOFMEMORY;

    pInMesh
->GenerateAdjacency(1e-6f, rgdwAdjacency);

    D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE];
    pInMesh
->GetDeclaration( decl );

    DWORD dwOptions 
= pInMesh->GetOptions();

    dwOptions 
&= ~(D3DXMESH_32BIT | D3DXMESH_SYSTEMMEM | D3DXMESH_WRITEONLY);
    dwOptions 
|= D3DXMESH_MANAGED;
    dwOptions 
|= D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE;

    ID3DXMesh
* pTempMesh = NULL;

    
if( FAILED( pInMesh->Optimize( dwOptions, rgdwAdjacency, NULL, NULL, NULL, &pTempMesh ) ) )
    {
        SAFE_DELETE_ARRAY( rgdwAdjacency );
        
return E_FAIL;
    }

    SAFE_DELETE_ARRAY( rgdwAdjacency );
    SAFE_RELEASE( m_pMesh );

    m_pMesh 
= pTempMesh;

    HRESULT hr 
= CreateMaterials( L"", pd3dDevice, pd3dxMaterials, dwMaterials );;    

    
// Extract data from m_pMesh for easy access

    m_dwNumVertices    
= m_pMesh->GetNumVertices();
    m_dwNumFaces       
= m_pMesh->GetNumFaces();
    m_dwBytesPerVertex 
= m_pMesh->GetNumBytesPerVertex();

    m_pMesh
->GetIndexBuffer( &m_pIB );
    m_pMesh
->GetVertexBuffer( &m_pVB );
    m_pMesh
->GetDeclaration( decl );

    pd3dDevice
->CreateVertexDeclaration( decl, &m_pDecl );

    
return hr;
}

 

為了優化網格的渲染,函數首先生成網格面鄰接信息緩存:
    DWORD *rgdwAdjacency = NULL;
    rgdwAdjacency = new DWORD[pInMesh->GetNumFaces() * 3];
    if( rgdwAdjacency == NULL )
        return E_OUTOFMEMORY;
    pInMesh->GenerateAdjacency(1e-6f, rgdwAdjacency);

GenerateAdjacency()的聲明如下:

Generate a list of mesh edges, as well as a list of faces that share each edge.

HRESULT GenerateAdjacency(
FLOAT Epsilon,
DWORD * pAdjacency
);

Parameters

Epsilon
[in] Specifies that vertices that differ in position by less than epsilon should be treated as coincident.
pAdjacency
[in] Pointer to an array of three DWORDs per face to be filled with the indices of adjacent faces. The number of bytes in this array must be at least 3 * ID3DXBaseMesh::GetNumFaces * sizeof(DWORD).

Return Values

If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be one of the following: D3DERR_INVALIDCALL, E_OUTOFMEMORY.

Remarks

After an application generates adjacency information for a mesh, the mesh data can be optimized for better drawing performance.

The order of the entries in the adjacency buffer is determined by the order of the vertex indices in the index buffer. The adjacent triangle 0 always corresponds to the edge between the indices of the corners 0 and 1. The adjacent triangle 1 always corresponds to the edge between the indices of the corners 1 and 2 while the adjacent triangle 2 corresponds to the edge between the indices of the corners 2 and 0.

為了優化網格的渲染,函數去除了32位索引、系統內存的使用、只寫訪問,增加了托管內存的使用,以及去除了無用的頂點和索引項、根據屬性給三角形排序并調整屬性表,增加了頂點緩存的命中率,并調用Optimize()對網格模型進行優化,優化后的網格模型存儲在pTempMesh中:

    DWORD dwOptions = pInMesh->GetOptions();
    dwOptions &= ~(D3DXMESH_32BIT | D3DXMESH_SYSTEMMEM | D3DXMESH_WRITEONLY);
dwOptions |= D3DXMESH_MANAGED;
dwOptions |= D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE;
    ID3DXMesh* pTempMesh = NULL;
    if( FAILED( pInMesh->Optimize( dwOptions, rgdwAdjacency, NULL, NULL, NULL, &pTempMesh ) ) )
{
SAFE_DELETE_ARRAY( rgdwAdjacency );
return E_FAIL;
}

接下來刪除了鄰接數組、網格指針,并將優化后的網格模型指針賦給m_pMesh,并調用CreateMaterials()創建材質和紋理資源:

    SAFE_DELETE_ARRAY( rgdwAdjacency );
SAFE_RELEASE( m_pMesh );
    m_pMesh = pTempMesh;
    HRESULT hr = CreateMaterials( L"", pd3dDevice, pd3dxMaterials, dwMaterials );

最后從優化后的網格模型中提取數據以方便日后訪問,并調用CreateVertexDeclaration()來創建頂點聲明:

   // Extract data from m_pMesh for easy access
    m_dwNumVertices    = m_pMesh->GetNumVertices();
m_dwNumFaces = m_pMesh->GetNumFaces();
m_dwBytesPerVertex = m_pMesh->GetNumBytesPerVertex();
    m_pMesh->GetIndexBuffer( &m_pIB );
m_pMesh->GetVertexBuffer( &m_pVB );
    D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE];
m_pMesh->GetDeclaration( decl );
pd3dDevice->CreateVertexDeclaration( decl, &m_pDecl );
    return hr;

CreateVertexDeclaration()的聲明如下:

Create a vertex shader declaration from the device and the vertex elements.

HRESULT CreateVertexDeclaration(
CONST D3DVERTEXELEMENT9* pVertexElements,
IDirect3DVertexDeclaration9** ppDecl
);

Parameters

pVertexElements
[in] An array of D3DVERTEXELEMENT9 vertex elements.
ppDecl
[out, retval] Pointer to an IDirect3DVertexDeclaration9 pointer that returns the created vertex shader declaration.

Return Values

If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.

Remarks

See the Vertex Declaration (Direct3D 9) page for a detailed description of how to map vertex declarations between different versions of DirectX.

 

函數Destroy()用來在程序退出時銷毀指定的資源:

HRESULT CDXUTMesh::Destroy()
{
InvalidateDeviceObjects();
    for( UINT i=0; i<m_dwNumMaterials; i++ )
SAFE_RELEASE( m_pTextures[i] );
    SAFE_DELETE_ARRAY( m_pTextures );
SAFE_DELETE_ARRAY( m_pMaterials );
SAFE_DELETE_ARRAY( m_strMaterials );
    SAFE_RELEASE( m_pMesh );
    m_dwNumMaterials = 0L;
    return S_OK;
}

posted on 2008-05-31 10:21 lovedday 閱讀(909) 評論(0)  編輯 收藏 引用

公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲久久一区| 亚洲精品美女在线观看| 性伦欧美刺激片在线观看| 在线亚洲美日韩| 国产乱码精品一区二区三区五月婷| 欧美在线黄色| 免费精品99久久国产综合精品| 亚洲三级国产| 亚洲婷婷综合色高清在线 | 91久久中文| 欧美日韩黄色大片| 欧美一区二区三区视频| 久久久视频精品| 99在线精品视频| 午夜国产精品影院在线观看| 在线精品国产成人综合| 99精品国产热久久91蜜凸| 国产日韩欧美在线观看| 欧美激情一区二区三区| 国产精品欧美一区喷水| 欧美成人高清| 国产精品欧美风情| 欧美福利一区二区三区| 国产精品护士白丝一区av| 麻豆精品网站| 国产精品亚洲综合色区韩国| 欧美黑人在线播放| 国产日韩欧美三区| 亚洲精品中文字幕有码专区| 好吊色欧美一区二区三区视频| 亚洲国语精品自产拍在线观看| 国产日本欧美一区二区三区在线| 91久久线看在观草草青青| 国产一区二区看久久| 日韩午夜中文字幕| 亚洲国产另类 国产精品国产免费| 一级成人国产| 99日韩精品| 免费在线观看成人av| 久久精品论坛| 国产精品视频免费| 一本色道久久综合| 日韩亚洲综合在线| 免费在线成人av| 麻豆91精品91久久久的内涵| 国产三级欧美三级| 亚洲一区二区日本| 亚洲一区二区三区在线| 欧美精品91| 亚洲人成久久| 99精品国产在热久久| 免费看的黄色欧美网站| 久久综合九色综合久99| 国产在线观看91精品一区| 亚洲午夜激情网站| 午夜精品久久久久久久99樱桃 | 免费日韩av电影| 久久久午夜精品| 国精产品99永久一区一区| 午夜在线视频一区二区区别| 午夜老司机精品| 国产精品入口夜色视频大尺度| 99精品视频免费观看| 亚洲视频日本| 国产精品户外野外| 亚洲欧美日韩精品在线| 欧美一级一区| 国产一区在线免费观看| 欧美综合77777色婷婷| 久久久久久久91| 亚洲福利专区| 欧美另类久久久品| 亚洲深夜福利| 久久久夜精品| 亚洲黄一区二区三区| 欧美精品在线视频| 一本色道久久综合亚洲91| 亚洲欧美综合网| 伊人精品久久久久7777| 欧美xart系列高清| 一区二区三区精品视频| 欧美伊人久久| 亚洲国产日韩一级| 欧美色图首页| 久久免费国产| 一本久久综合| 久久综合给合久久狠狠狠97色69| 亚洲日本电影| 国产日韩精品视频一区| 久久综合九色综合欧美狠狠| 日韩亚洲视频| 蜜臀a∨国产成人精品| 99精品热视频只有精品10| 国产精品午夜在线观看| 久久视频在线看| 一本色道久久88综合日韩精品 | 久久久久国内| 中文欧美日韩| 亚洲国产高清在线观看视频| 国产精品二区三区四区| 久久九九免费视频| 一本色道久久88综合日韩精品| 蜜桃久久av一区| 亚洲欧美在线一区二区| 亚洲精品一线二线三线无人区| 国产欧美日韩另类视频免费观看| 欧美成人免费在线| 欧美专区在线| 午夜精品福利在线观看| 亚洲精品小视频在线观看| 久久综合电影一区| 午夜激情综合网| 野花国产精品入口| 亚洲国产成人av| 国产色综合久久| 国产精品福利网| 欧美激情综合色| 你懂的国产精品永久在线| 久久精品国产精品亚洲精品| 亚洲影院免费观看| 一本一本久久a久久精品综合妖精| 欧美激情91| 免费一级欧美片在线播放| 久久精品国产一区二区三区免费看| 亚洲午夜一区二区三区| 亚洲精品一区二区三区樱花 | 在线日韩av| 激情文学一区| 国产一区二区在线观看免费| 国产精品每日更新| 国产精品hd| 国产精品美女久久久久久2018| 欧美偷拍另类| 欧美吻胸吃奶大尺度电影| 欧美日韩视频一区二区三区| 欧美激情二区三区| 欧美成人综合网站| 欧美精品 日韩| 欧美日韩亚洲国产精品| 欧美日韩免费观看一区| 欧美日韩一区二| 欧美午夜精品| 国产精品一区二区在线观看网站| 国产精品久久久久久一区二区三区| 欧美日韩综合在线| 国产精品久久久久久久app| 欧美午夜片欧美片在线观看| 国产精品久久久久久久久果冻传媒 | 久久一区欧美| 欧美激情精品久久久久久蜜臀 | 亚洲国产aⅴ天堂久久| 亚洲三级观看| 亚洲字幕在线观看| 欧美一区二区国产| 免费在线观看一区二区| 亚洲国产精品福利| 一区二区av在线| 性做久久久久久久久| 久久久久久网| 欧美日韩岛国| 国产欧美精品一区aⅴ影院| 狠狠爱www人成狠狠爱综合网| 亚洲电影免费观看高清| 一本色道久久精品| 欧美一区2区三区4区公司二百| 久久嫩草精品久久久久| 亚洲激情国产精品| 亚洲永久精品国产| 久久视频这里只有精品| 欧美日韩人人澡狠狠躁视频| 国产欧美一区二区三区视频 | 欧美亚州一区二区三区| 国产一区二区三区高清在线观看| 亚洲国产福利在线| 亚洲欧美日韩在线不卡| 欧美成va人片在线观看| 亚洲视频电影在线| 久久综合伊人77777| 国产精品日韩一区二区三区| 亚洲日本成人| 久久国产精品99国产精| 亚洲精品日产精品乱码不卡| 久久精品91久久久久久再现| 欧美视频日韩视频在线观看| 精品动漫一区| 欧美一区在线视频| 亚洲乱码一区二区| 久久伊人亚洲| 国产亚洲日本欧美韩国| 中文av一区二区| 亚洲成人自拍视频| 久久高清福利视频| 国产精品免费久久久久久| 亚洲伦理久久| 欧美福利一区| 久久一区二区三区四区| 国产视频欧美| 欧美一区=区| 亚洲一区二区三区三| 欧美日韩亚洲高清一区二区|