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

天行健 君子當自強而不息

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

類CDXUTMesh主要用于從一個指定的網格模型中加載數據、渲染模型以及銷毀網格模型,它將整個網格模型作為一個整體進行操作,沒有考慮網格模型內部的框架層次,對于不包含動畫信息的網格模型,使用該類是一個比較好的選擇。

這個類的定義和實現分別位于DXUTMesh.h和DXUTMesh.cpp中,其定義如下:

//-----------------------------------------------------------------------------
// Name: class CDXUTMesh
// Desc: Class for loading and rendering file-based meshes
//-----------------------------------------------------------------------------
class CDXUTMesh
{
public:
    WCHAR                            m_strName[
512];
    LPD3DXMESH                        m_pMesh;   
// Managed mesh
    
    
// Cache of data in m_pMesh for easy access

    IDirect3DVertexBuffer9
*            m_pVB;
    IDirect3DIndexBuffer9
*            m_pIB;
    IDirect3DVertexDeclaration9
*    m_pDecl;
    DWORD                           m_dwNumVertices;
    DWORD                           m_dwNumFaces;
    DWORD                           m_dwBytesPerVertex;

    DWORD                           m_dwNumMaterials; 
// Materials for the mesh
    D3DMATERIAL9*                   m_pMaterials;
    CHAR                            (
*m_strMaterials)[MAX_PATH];
    IDirect3DBaseTexture9
**         m_pTextures;
    
bool                            m_bUseMaterials;

public:
    
// Rendering
    HRESULT Render( LPDIRECT3DDEVICE9 pd3dDevice, 
                    
bool bDrawOpaqueSubsets = true,
                    
bool bDrawAlphaSubsets = true );

    HRESULT Render( ID3DXEffect 
*pEffect,
                    D3DXHANDLE hTexture 
= NULL,
                    D3DXHANDLE hDiffuse 
= NULL,
                    D3DXHANDLE hAmbient 
= NULL,
                    D3DXHANDLE hSpecular 
= NULL,
                    D3DXHANDLE hEmissive 
= NULL,
                    D3DXHANDLE hPower 
= NULL,
                    
bool bDrawOpaqueSubsets = true,
                    
bool bDrawAlphaSubsets = true );

    
// Mesh access
    LPD3DXMESH GetMesh() { return m_pMesh; }

    
// Rendering options
    void    UseMeshMaterials( bool bFlag ) { m_bUseMaterials = bFlag; }
    HRESULT SetFVF( LPDIRECT3DDEVICE9 pd3dDevice, DWORD dwFVF );
    HRESULT SetVertexDecl( LPDIRECT3DDEVICE9 pd3dDevice, 
const D3DVERTEXELEMENT9 *pDecl, 
                           
bool bAutoComputeNormals = truebool bAutoComputeTangents = true
                           
bool bSplitVertexForOptimalTangents = false );

    
// Initializing
    HRESULT RestoreDeviceObjects( LPDIRECT3DDEVICE9 pd3dDevice );
    HRESULT InvalidateDeviceObjects();

    
// Creation/destruction
    HRESULT Create( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strFilename );
    HRESULT Create( LPDIRECT3DDEVICE9 pd3dDevice, LPD3DXFILEDATA pFileData );
    HRESULT Create(LPDIRECT3DDEVICE9 pd3dDevice, ID3DXMesh
* pInMesh, D3DXMATERIAL* pd3dxMaterials, DWORD dwMaterials);

    HRESULT CreateMaterials(LPCWSTR strPath, IDirect3DDevice9 
*pd3dDevice, 
                            D3DXMATERIAL
* d3dxMtrls, DWORD dwNumMaterials);
    HRESULT Destroy();

    CDXUTMesh( LPCWSTR strName 
= L"CDXUTMeshFile_Mesh" );
    
virtual ~CDXUTMesh();
};

 

該類中包含的成員函數按其作用可分為6類。

第一類是構造和析構函數,函數CDXUTMesh()和~CDXUTMesh()分別是該類的構造函數和析構函數,其作用分別是進行一些初始化工作以及在類CDXUTMesh的對象被銷毀時完成最后的銷毀工作。

CDXUTMesh::CDXUTMesh( LPCWSTR strName )
{
StringCchCopy( m_strName, 512, strName );
    m_pMesh              = NULL;
m_pMaterials = NULL;
m_pTextures = NULL;
m_bUseMaterials = TRUE;
m_pVB = NULL;
m_pIB = NULL;
m_pDecl = NULL;
m_strMaterials = NULL;
m_dwNumMaterials = 0;
m_dwNumVertices = 0;
m_dwNumFaces = 0;
m_dwBytesPerVertex = 0;
}
CDXUTMesh::~CDXUTMesh()
{
Destroy();
}

第二類是獲取網格函數,它僅包含一個函數GetMesh(),實現也非常簡單,即返回類CDXUTMesh的成員變量m_pMesh。

LPD3DXMESH GetMesh() { return m_pMesh; }

第三類是設備恢復和丟失時所采取的操作函數,這里所包含的兩個成員函數RestoreDeviceObjects()和InvalidateDeviceObjects()分別是在設備恢復和丟失時調用,用于恢復和釋放相應的資源。

HRESULT CDXUTMesh::RestoreDeviceObjects( LPDIRECT3DDEVICE9 pd3dDevice )
{
return S_OK;
}
HRESULT CDXUTMesh::InvalidateDeviceObjects()
{
SAFE_RELEASE( m_pIB );
SAFE_RELEASE( m_pVB );
SAFE_RELEASE( m_pDecl );
    return S_OK;
}

第四類是創建和銷毀函數,這里首先重載了3個創建網格模型函數Create(),它們依次用于從指定的.x文件創建網格模型,從接口ID3DXFileData創建網格模型,從輸入的網格模型中創建新的網格模型。函數CreateMaterials()用于創建網格模型中所需的材質和紋理。函數Destroy()用來在程序退出時銷毀指定的資源。

來看第一個Create()函數的實現:

HRESULT CDXUTMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strFilename )
{
    WCHAR        strPath[MAX_PATH];
    LPD3DXBUFFER pAdjacencyBuffer 
= NULL;
    LPD3DXBUFFER pMtrlBuffer 
= NULL;
    HRESULT      hr;

    
// Cleanup previous mesh if any
    Destroy();

    
// Find the path for the file, and convert it to ANSI (for the D3DX API)
    DXUTFindDXSDKMediaFileCch( strPath, sizeof(strPath) / sizeof(WCHAR), strFilename );

    
// Load the mesh
    if(FAILED(hr = D3DXLoadMeshFromXW(strPath, 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;
    }

    
// Set strPath to the path of the mesh file

    WCHAR
* pLastBSlash = wcsrchr( strPath, L'\\' );

    
if( pLastBSlash )
        
*(pLastBSlash + 1= L'\0';
    
else
        
*strPath = L'\0';

    D3DXMATERIAL
* d3dxMtrls = (D3DXMATERIAL*) pMtrlBuffer->GetBufferPointer();
    hr 
= CreateMaterials( strPath, 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;
}

 

函數首先銷毀舊的資源,并調用DXUTFindDXSDKMediaFileCch()通過文件名查找文件所在的路徑,接著調用D3DXLoadMeshFromXW()從文件中加載網格模型。

DXUTFindDXSDKMediaFileCch()的實現分析請參閱DXUT源碼分析 ---- 媒體文件查找函數

    WCHAR        strPath[MAX_PATH];
LPD3DXBUFFER pAdjacencyBuffer = NULL;
LPD3DXBUFFER pMtrlBuffer = NULL;
HRESULT hr;
    // Cleanup previous mesh if any
Destroy();
    // Find the path for the file, and convert it to ANSI (for the D3DX API)
DXUTFindDXSDKMediaFileCch( strPath, sizeof(strPath) / sizeof(WCHAR), strFilename );
    // Load the mesh
if(FAILED(hr = D3DXLoadMeshFromXW(strPath, D3DXMESH_MANAGED, pd3dDevice, &pAdjacencyBuffer, &pMtrlBuffer, NULL,
&m_dwNumMaterials, &m_pMesh)))
{
return hr;
}

接著調用OptimizeInplace()對網格模型進行優化,該函數調用時第一個參數的含義如下:

D3DXMESHOPT_COMPACT — 從mesh中移除沒有用的頂點和索引項。

D3DXMESHOPT_ATTRSORT — 根據屬性給三角形排序并調整屬性表,這將使DrawSubset執行更有效。

D3DXMESHOPT_VERTEXCACHE — 增加頂點緩存的命中率。

   // 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;
}

接下來,函數將模型文件所在的路徑存儲在strPath,如果沒有路徑,則strPath置為NULL。

   // Set strPath to the path of the mesh file
    WCHAR* pLastBSlash = wcsrchr( strPath, L'\\' );
    if( pLastBSlash )
*(pLastBSlash + 1) = L'\0';
else
*strPath = L'\0';

接下來,函數調用CreateMaterials()創建存儲材質和紋理的內存,并釋放鄰接信息緩存和材質緩存。

    D3DXMATERIAL* d3dxMtrls = (D3DXMATERIAL*) pMtrlBuffer->GetBufferPointer();
hr = CreateMaterials( strPath, pd3dDevice, d3dxMtrls, m_dwNumMaterials );
    SAFE_RELEASE( pAdjacencyBuffer );
SAFE_RELEASE( pMtrlBuffer );

最后,函數獲取模型的頂點數,面數,每個頂點所占的字節大小,頂點索引緩存,頂點緩存,頂點聲明,以方便以后訪問。

    // 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;

posted on 2008-05-31 08:58 lovedday 閱讀(1261) 評論(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>
            日韩一区二区精品| 亚洲精品欧美日韩专区| 国产色爱av资源综合区| 欧美午夜视频在线观看| 欧美国产乱视频| 欧美成人激情视频| 久久先锋资源| 久久久久一区| 久久夜色精品国产欧美乱极品| 亚洲在线一区| 亚洲天堂av电影| 性久久久久久久久久久久| 亚洲欧美国产精品专区久久| 一区二区动漫| 亚洲一区二区精品在线| 欧美一区二区国产| 久久亚洲欧美| 欧美日韩国产不卡| 国产精品成人av性教育| 国产日韩欧美视频| 在线免费观看日韩欧美| 亚洲国产欧美一区二区三区丁香婷| 亚洲日本理论电影| 亚洲自拍偷拍麻豆| 久久久久久网| 亚洲国产毛片完整版 | 国产在线播精品第三| 久久精品中文字幕一区| 免费观看在线综合| 亚洲精品一区二区在线观看| aa成人免费视频| 久久黄色影院| 欧美性色视频在线| 国产日韩一区二区三区在线播放 | 亚洲女同在线| 久久琪琪电影院| 亚洲精选91| 久久精品视频网| 欧美日韩美女| 亚洲电影av| 性欧美超级视频| 亚洲国产1区| 香蕉久久夜色精品国产使用方法| 麻豆成人av| 国产麻豆精品久久一二三| 亚洲国产合集| 午夜精品久久久久久| 久久精品一区| 99国产精品视频免费观看一公开 | 亚洲一区在线看| 久久久亚洲一区| 国产精品啊啊啊| 亚洲乱码视频| 久久综合亚洲社区| 日韩西西人体444www| 久久人91精品久久久久久不卡| 欧美日韩国产免费| 亚洲国产欧美不卡在线观看| 欧美一区二区在线看| 99热在这里有精品免费| 欧美高清在线一区二区| 在线观看成人av| 久久免费视频这里只有精品| 亚洲天天影视| 欧美精品一区二区三区一线天视频| 国产一区二区三区网站| 亚洲女优在线| 亚洲香蕉伊综合在人在线视看| 欧美激情一区二区三区高清视频| 在线日韩av| 开元免费观看欧美电视剧网站| 校园春色综合网| 国产一区成人| 卡一卡二国产精品| 麻豆91精品91久久久的内涵| 亚洲黄色成人网| 欧美久久成人| 欧美日韩国产va另类| 99综合电影在线视频| 欧美高清在线播放| 欧美大色视频| 亚洲自拍偷拍视频| 性欧美激情精品| 亚洲国产欧美一区二区三区丁香婷| 亚洲电影自拍| 国产精品成人一区二区艾草| 欧美一区亚洲| 黑人极品videos精品欧美裸| 性欧美1819性猛交| 伊人久久婷婷| 亚洲片区在线| 国产精品丝袜久久久久久app| 欧美在线观看一区| 久久人人爽人人| 99精品视频免费| 午夜精品理论片| 亚洲国产精彩中文乱码av在线播放| 亚洲精品久久久一区二区三区| 国产精品国产三级国产aⅴ入口 | 国产麻豆视频精品| 麻豆精品一区二区综合av| 欧美日韩国产a| 久久亚洲精品视频| 欧美日韩免费一区二区三区视频| 亚洲一区二区三区四区在线观看 | 性欧美18~19sex高清播放| 久久人体大胆视频| 在线午夜精品| 欧美大片一区| 美女脱光内衣内裤视频久久影院| 亚洲先锋成人| 亚洲视频免费在线观看| 欧美人与性禽动交情品 | 久久综合色综合88| 亚洲电影免费观看高清完整版在线观看 | 欧美色123| 99在线观看免费视频精品观看| 久久综合九色综合欧美就去吻| 校园春色国产精品| 久久久久久国产精品一区| 亚洲精品乱码久久久久久日本蜜臀 | 欧美影片第一页| 亚洲女同在线| 老司机精品福利视频| 久久激情综合网| 亚洲福利在线视频| 亚洲巨乳在线| 国产精品热久久久久夜色精品三区| 午夜精品久久久久久久久久久 | 亚洲伦理中文字幕| 久久久视频精品| 日韩午夜电影| 中文日韩在线| 国产欧美日韩精品丝袜高跟鞋| 久久成人一区| 欧美福利精品| 一区二区免费在线视频| 亚洲午夜激情| 亚洲成人在线网站| 日韩亚洲国产精品| 国产婷婷一区二区| 亚洲人成啪啪网站| 免费视频最近日韩| 亚洲综合久久久久| 久久综合99re88久久爱| 国产日韩欧美成人| 亚洲欧美日韩网| 午夜精品久久久久99热蜜桃导演| 国产一区免费视频| 亚洲国产欧美日韩| 欧美亚洲成人免费| 欧美国产日韩一区| 国产精品免费电影| 亚洲视频在线播放| 校园春色综合网| 一本色道久久99精品综合 | 亚洲一级在线观看| 新狼窝色av性久久久久久| 91久久国产自产拍夜夜嗨| 亚洲欧美国产77777| 一本色道88久久加勒比精品 | 欧美黄色aaaa| 久久精品日韩欧美| 欧美日韩国产精品专区 | 久久蜜桃资源一区二区老牛| 日韩视频在线一区二区三区| 国产午夜精品一区理论片飘花| 亚洲精品美女| 亚洲激情在线视频| 亚洲图片欧美午夜| 久久久青草青青国产亚洲免观| 欧美日韩日本国产亚洲在线| 欧美成年视频| 一区二区亚洲精品国产| 欧美一区二区视频97| 亚洲一区二区毛片| 怡红院精品视频| 久久精品国产免费观看| 久久精品视频99| 国产视频一区二区三区在线观看| 日韩一级在线| 亚洲一区二区三区视频| 在线成人av网站| 老司机成人在线视频| 狂野欧美激情性xxxx| 黄色精品一区| 久久综合精品国产一区二区三区| 久久看片网站| 国产精品www色诱视频| 最新高清无码专区| 夜夜嗨av色综合久久久综合网 | 亚洲午夜在线视频| 国产一区二区三区日韩| 欧美经典一区二区三区| 亚洲欧洲综合另类| 一区二区三区产品免费精品久久75| 欧美日韩国产精品自在自线| 亚洲性线免费观看视频成熟| 性视频1819p久久| 国产精品午夜视频|