今天看了書中Basic2的例子,主要在兩個方面:
- 如何將紋理映射到對象上;
- 如何使用框架提供的字體類。
為了貼一張2D紋理要做的事情:
- 在頂點結構中使用2個紋理坐標變量,并將其一起填充到頂點緩沖器中;
- 在InitDeviceObjects()函數中,使用D3DUtil_CreateTexture()創建紋理;
- 在Render()函數中,根據相應的狀態使用SetTexture()設置紋理;
- 在DeleteDeviceObjects()中,使用SAFE_RELEASE()宏釋放紋理。
紋理是一種設備相關的資源,因此要在InitDeviceObject()中創建。紋理經過了:創建->設置->釋放,這樣一個生存周期。
字體的使用相對比較簡單,在應用程序類的構造函數里邊創建字體類的對象,然后在對應的函數中調用字體類的函數就可以了。注意的是:在Render()里邊調用的是DrawText(),其他都是同名函數。最后在析構函數中刪除字體類對象。
下面來看一下代碼。
m_pFont = new CD3DFont( _T("Arial"), 12, D3DFONT_BOLD );
HRESULT CMyD3DApplication::InitDeviceObjects()
{
m_pFont->InitDeviceObjects( m_pd3dDevice );//字體的對應函數
// 載入一張圖片來創建紋理
if( FAILED( D3DUtil_CreateTexture( m_pd3dDevice, _T("Lake.bmp"),
&m_pBackgroundTexture) ) )
return D3DAPPERR_MEDIANOTFOUND;
return S_OK;
}
- RestoreDeviceObjects()函數基本沒有變化,只是添加一個m_pFont->RestoreDeviceObjects();然后把帶有紋理坐標的頂點數據拷貝到緩存中,注意紋理坐標全部位于[0,1]之間。
- Render()函數
HRESULT CMyD3DApplication::Render()
{
// Begin the scene
if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
{
// Set up texture stage states for the background
m_pd3dDevice->SetTexture( 0, m_pBackgroundTexture );//將紋理指定給設備的某個特定階段,D3D提供8個紋理階段,這意味著在一次DrawPrimitive()調用同時設置最多8張紋理;當然也可以多次調用DrawPrimitive(),稱之為多遍繪制(multi-pass),SetTexture()的第一個參數就是希望使用的紋理階段編號,可以為每個階段指定一個紋理.但程序中指定了當前紋理,在改變之前所有的圖元繪制都會采用該紋理,也就是說如果每個圖元都有自己的紋理,那么在繪制之前都要設置其相應的紋理。
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );//指定第一個參數是SetTexture()設置的紋理顏色
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );//通過D3DTSS_COLOROP來選擇一個顏色操作,D3DTOP_SELECTARG1告知紋理單元使用第一個參數作為輸出。這兩句的共同作用就是指定輸出為所設置紋理的顏色。
//SetTextureStageState()可用于在不同的Materail之間對顏色和alpha做混合,可用于指定D3D紋理引擎和象素引擎的操作和參數。第一個參數給出要使用的紋理,即哪個階段的問題,第2個參數是系統設置的紋理狀態類型。有兩種主要類型:D3DTSS_COLORx系列和D3DTSS_ALPHAx系列,分別控制一個RGB向量和一個Alpha標量在通過象素處理流水線中可并行處理部分的操作。
// Passing an FVF to IDirect3DDevice9::SetFVF specifies a legacy FVF with stream 0.
m_pd3dDevice->SetFVF(FVF );
m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof(VERTEX) );
m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 2 );
// Output statistics
m_pFont->DrawText( 2, 0, D3DCOLOR_ARGB(255,255,255,0), m_strFrameStats );//繪制幀率
m_pFont->DrawText( 2, 20, D3DCOLOR_ARGB(255,255,255,0), m_strDeviceStats );//繪制設備
// End the scene.
m_pd3dDevice->EndScene();
}
return S_OK;
}
- 其他略過,凡是在對應函數中創建的記得在對應的銷毀函數中干掉就行了。

轉自:http://blog.sina.com.cn/u/40d00f17010001c3