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

天行健 君子當自強而不息

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 閱讀(914) 評論(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>
            一区二区三区视频免费在线观看| 欧美精品1区2区3区| 欧美日韩一区二区三区在线视频 | 美女亚洲精品| 欧美一区二区三区精品| 国产片一区二区| 久久久久一区| 久久综合成人精品亚洲另类欧美| 欧美日韩久久精品| 中文久久乱码一区二区| 在线一区二区日韩| 久久综合狠狠综合久久综合88| 欧美激情片在线观看| 99热这里只有精品8| 在线视频你懂得一区二区三区| 久久久精品动漫| 免费观看一级特黄欧美大片| 在线观看视频一区二区| 欧美激情二区三区| 欧美成人在线免费视频| 一区二区三区精品视频| 午夜精品电影| 狠狠狠色丁香婷婷综合激情| 欧美国产日韩一区二区三区| 99精品热视频只有精品10| 欧美精品亚洲二区| 亚洲图片欧美一区| 午夜视频在线观看一区二区三区| 欧美日本在线看| 午夜欧美视频| 免费观看一级特黄欧美大片| 亚洲在线观看视频| 久久婷婷人人澡人人喊人人爽 | 午夜在线观看欧美| 亚洲高清视频一区二区| 亚洲视频视频在线| 亚洲激情成人在线| 午夜欧美理论片| 亚洲精品国精品久久99热一| 亚洲影院污污.| 亚洲激情亚洲| 欧美一区二区精品| 国产在线成人| 亚洲精品永久免费精品| 有坂深雪在线一区| 欧美sm视频| 麻豆精品视频| 亚洲激情视频| 久久丁香综合五月国产三级网站| 国产亚洲一区二区三区在线观看| 欧美一区亚洲二区| 欧美一区二区三区在线视频 | 欧美在线视频日韩| 正在播放亚洲| 蜜桃视频一区| 模特精品裸拍一区| 国产一区二区在线免费观看| 亚洲最新在线| 一本久久综合亚洲鲁鲁五月天| 亚洲精品国产品国语在线app| 欧美肥婆在线| 欧美gay视频| 狠狠色丁香久久婷婷综合丁香| 免费欧美在线| 狠狠色狠狠色综合人人| 欧美大片在线影院| 一区精品在线| 久久人人爽人人爽爽久久| 久久久久99| 国产亚洲精品aa午夜观看| 久久天堂成人| 国内视频一区| 亚洲高清不卡在线| 欧美在线播放| 亚洲国产精品久久久久久女王| 亚洲国产精品va| 91久久极品少妇xxxxⅹ软件| 美女图片一区二区| 欧美韩日一区二区| 国产精品爱久久久久久久| 久久经典综合| 在线观看成人一级片| 美女日韩在线中文字幕| 免费日韩av电影| 99热在线精品观看| 欧美视频在线看| 欧美成人精品在线播放| 亚洲人被黑人高潮完整版| 欧美成人免费视频| 一区二区三区四区蜜桃| 亚洲高清不卡| 欧美片网站免费| 亚洲自拍电影| 米奇777超碰欧美日韩亚洲| 91久久精品国产91性色tv| 欧美日韩1区2区| 午夜视频在线观看一区二区三区| 日韩视频三区| 国产精品日韩一区二区| 久久乐国产精品| 久久久久久黄| 亚洲美女色禁图| 久久久噜噜噜久久中文字免| 亚洲黑丝一区二区| 亚洲欧美日韩另类| 影音先锋亚洲电影| 欧美女激情福利| 小处雏高清一区二区三区| 一区二区三区四区国产精品| 国产日韩专区| 亚洲视频免费| 亚洲成人在线免费| 国产精品福利网| 欧美一区二区三区四区视频| 亚洲国产91| 久久福利资源站| aaa亚洲精品一二三区| 国内精品久久久久久久影视蜜臀| 欧美在线地址| 日韩亚洲精品在线| 一区二区三区成人精品| 国产日韩亚洲欧美| 欧美日韩综合| 欧美激情一区二区三区不卡| 小处雏高清一区二区三区| 欧美在线视频一区二区三区| 亚洲精品免费看| 极品尤物久久久av免费看| 欧美性开放视频| 欧美黄色网络| 欧美18av| 免费在线成人| 久久久亚洲国产天美传媒修理工| 久久一区精品| 欧美主播一区二区三区| 亚洲美女啪啪| 亚洲日韩成人| 亚洲精品少妇| 亚洲国产精品一区在线观看不卡| 欧美精品v日韩精品v国产精品| 亚洲精品欧洲精品| 欧美电影资源| 亚洲视频免费观看| 99热在线精品观看| 日韩一本二本av| 亚洲免费观看视频| 亚洲人被黑人高潮完整版| 揄拍成人国产精品视频| 欧美精品日韩www.p站| 麻豆亚洲精品| 欧美成人午夜剧场免费观看| 免费永久网站黄欧美| 亚洲免费观看在线观看| 欧美视频日韩| 欧美77777| 久久国产主播精品| 久久国产一区| 久久综合九色综合欧美就去吻| 亚洲国产精品成人一区二区| 欧美亚男人的天堂| 欧美视频在线不卡| 国产精品久久久久久久久动漫| 欧美一区中文字幕| 欧美中文字幕精品| 久热这里只精品99re8久| 久久久人成影片一区二区三区观看| 欧美成人按摩| 亚洲精品日韩在线| 午夜精品网站| 久久综合久久美利坚合众国| 猛男gaygay欧美视频| 美女国产一区| 欧美色区777第一页| 国产精品一区二区三区成人| 国内精品嫩模av私拍在线观看| 欧美美女日韩| 国产亚洲一区二区在线观看| 国内精品视频在线观看| 亚洲美女电影在线| 亚洲欧美视频| 欧美电影在线观看完整版| 99re6热只有精品免费观看| 午夜伦理片一区| 欧美精品九九99久久| 国产精品性做久久久久久| 亚洲国产国产亚洲一二三| 亚洲视频福利| 女女同性精品视频| 国产精品99久久久久久久久| 欧美在线91| 欧美日韩精品一区二区| 国内一区二区在线视频观看 | 欧美伊人久久| 欧美激情一区二区三区全黄| 国产日韩欧美精品在线| 一本久久综合亚洲鲁鲁五月天| 在线观看国产欧美| 亚洲欧美999| 亚洲精品免费电影| 午夜精品福利一区二区蜜股av|