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

天行健 君子當自強而不息

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(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>
            欧美人与性动交α欧美精品济南到| 亚洲国产91精品在线观看| 亚洲黄色成人| 欧美极品一区二区三区| 99精品国产在热久久| 亚洲国产综合在线看不卡| 欧美电影免费观看高清完整版| 欧美日韩 国产精品| 91久久夜色精品国产九色| 亚洲欧美日韩国产精品| 亚洲一区二区免费视频| 国产日韩欧美二区| 久久中文字幕导航| 欧美激情亚洲精品| 午夜久久美女| 久久久国际精品| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲国产精品成人| 亚洲欧美日韩精品一区二区 | 久久久噜噜噜久久中文字免| 久久动漫亚洲| 亚洲精品综合| 欧美mv日韩mv国产网站| 亚洲一区二区综合| 揄拍成人国产精品视频| 亚洲精品一区二区三区婷婷月| 久久99伊人| 日韩一二三区视频| 欧美大片在线观看一区| 欧美日韩mp4| 久久久www| 欧美精品一区二区蜜臀亚洲| 亚洲丰满少妇videoshd| 亚洲最新色图| 在线看不卡av| 亚洲亚洲精品三区日韩精品在线视频 | 久久久久久久波多野高潮日日 | 美女国产一区| 欧美精品一区二区三区蜜桃| 久久爱91午夜羞羞| 欧美伦理91| 久久久久久色| 国产精品久久久久久久app| 欧美不卡在线视频| 久久午夜电影网| 欧美在线视频观看免费网站| 欧美大胆成人| 免费在线亚洲| 国产在线精品自拍| 亚洲视频第一页| 日韩午夜一区| 另类av导航| 久久综合999| 国产精品五月天| 欧美中文日韩| 欧美日韩理论| 亚洲三级性片| 亚洲精品免费一区二区三区| 久久国产精彩视频| 欧美在线观看视频一区二区三区| 99视频精品全部免费在线| 亚洲二区在线| 久久综合一区二区| 国产日韩精品在线播放| 9i看片成人免费高清| 亚洲精品国精品久久99热一| 久久久久www| 亚洲精品九九| 蜜桃av综合| 亚洲一区二区精品在线观看| 亚洲欧美久久久| 亚洲欧美综合一区| 国产精品免费看片| 亚洲免费视频观看| 久久国产精品一区二区三区四区 | 亚洲国产高清aⅴ视频| 亚洲成人在线网| 麻豆精品在线视频| 欧美激情五月| 亚洲乱码国产乱码精品精| 欧美激情偷拍| 一区二区三区四区精品| 亚洲免费在线播放| 国产日韩欧美日韩大片| 亚洲国产免费看| 亚洲狼人精品一区二区三区| 欧美成人资源网| 99视频在线观看一区三区| 亚洲制服av| 国产午夜精品一区二区三区视频| 亚洲国产日韩一区| 国产有码在线一区二区视频| 亚洲激情图片小说视频| 亚洲午夜激情网站| 国产精品亚发布| 久久视频在线看| 久久成人综合网| 亚洲国产福利在线| 欧美香蕉大胸在线视频观看| 亚洲欧美日韩高清| 欧美99在线视频观看| 亚洲视频碰碰| 国产一区二区激情| 中文av一区二区| 久久综合给合久久狠狠狠97色69| 国产精品你懂得| 久久久福利视频| 日韩视频一区二区三区| 久久久久久欧美| 亚洲一二三级电影| 欲色影视综合吧| 久久九九免费视频| 久久精品视频在线播放| 日韩视频免费在线观看| 女人色偷偷aa久久天堂| 亚洲一区二区三区777| 欧美第一黄色网| 性感少妇一区| 日韩午夜激情| 极品日韩久久| 国产欧美日韩麻豆91| 午夜精品理论片| 欧美一区在线直播| 一本一道久久综合狠狠老精东影业| 欧美~级网站不卡| 午夜精品久久久久久99热| 亚洲精品一区二区三区不| aⅴ色国产欧美| 欧美日韩一视频区二区| 麻豆精品网站| 久久精品国产精品亚洲综合| 麻豆免费精品视频| 久久疯狂做爰流白浆xx| 亚洲欧美不卡| 夜夜嗨av一区二区三区网页 | 欧美在线播放| 亚洲永久精品大片| 一区二区三区久久精品| 亚洲第一页中文字幕| 裸体一区二区三区| 久久人人97超碰人人澡爱香蕉| 亚洲电影下载| 狠狠色狠狠色综合系列| 国产视频在线观看一区| 久久亚洲风情| 久久综合九色99| 久热精品在线| 欧美二区视频| 欧美高清在线视频| 亚洲欧美日韩国产中文在线| 久久影院午夜论| 欧美在线|欧美| 欧美在线地址| 久久久综合香蕉尹人综合网| 欧美一区二区免费| 最新国产の精品合集bt伙计| 亚洲黄色成人久久久| 亚洲激情一区二区| 亚洲美女av在线播放| av成人免费| 亚洲欧美日韩精品久久久| 很黄很黄激情成人| 欧美日韩日日骚| 国产精品美女主播| 国产欧美va欧美va香蕉在| 米奇777超碰欧美日韩亚洲| 奶水喷射视频一区| 欧美精品一区二区三区蜜臀| 欧美日韩卡一卡二| 国产精一区二区三区| 国产一区二区中文| 91久久黄色| 一本色道久久精品| 久久国产夜色精品鲁鲁99| 久久久噜噜噜久久人人看| 亚洲福利视频三区| 一区二区三区视频免费在线观看| 欧美成年人网站| 日韩一级片网址| 亚洲福利一区| 亚洲午夜精品国产| 亚洲裸体视频| 亚洲综合日韩在线| 一本久道久久综合中文字幕| 欧美韩日亚洲| 亚洲一区久久| 欧美高清在线一区| 久久免费的精品国产v∧| 欧美日韩成人一区| 国产在线麻豆精品观看| 亚洲毛片在线看| 久久国产精品高清| 亚洲人在线视频| 久久精品在这里| 国产精品成人久久久久| 亚洲欧洲日本专区| 久久九九免费| 亚洲一区二区久久| 欧美精品v日韩精品v韩国精品v| 欧美91大片|