簡介:ID3DXSprite是DriectX 9.0裡面的一個簡單模組,在DriectX 9.0協助文檔裡面對其功能的描術為:“向使用者提供一套簡單的在螢幕上實現精靈渲染的介面。”何為精靈渲染,說白了就是渲染2D畫面,ID3DXSprite協助使用者透過簡單的操作就能運用DriectX 9.0製作2D遊戲(渲染2D圖形),ID3DXSprite的功能還包括:協助使用者在3D遊戲裡面實現“公告牌”技術。下面,將對如何使用ID3DXSprite作詳細分折。
得到一個ID3DXSprite對像:玩過DriectX的人都知道,幹什麼前都得先取得一個執行個體對像,其實只要簡單調用D3DX為我們提供的一個函數就可完成:
HRESULT D3DXCreateSprite(
LPDIRECT3DDEVICE9 pDevice,
LPD3DXSPRITE * ppSprite
)
這個函數如何調用,不用我解釋了吧,碰過DriectX的人都應該知道他裡面的意思。
渲染準備:DirectX 9.0規定,運用ID3DXSprite渲染2D圖形前,應先調用ID3DXSprite::Begin做準備工作,在渲染工作完成之後,調用ID3DXSprite::End做善後工作。格式如下:
g_pSprite->Begin(NULL);
//渲染代碼部分。。。。
g_pSprite->End();
其中,ID3DXSprite::Begin接收一個參數,該參數將決定精靈以什麼方式進行渲染,該參數可以為以下值之一:
· D3DXSPRITE_ALPHABLEND
· D3DXSPRITE_BILLBOARD
· D3DXSPRITE_DONOTMODIFY_RENDERSTATE
· D3DXSPRITE_DONOTSAVESTATE
· D3DXSPRITE_OBJECTSPACE
· D3DXSPRITE_SORT_DEPTH_BACKTOFRONT
· D3DXSPRITE_SORT_DEPTH_FRONTTOBACK
· D3DXSPRITE_SORT_TEXTURE
上面的標誌可以合并使用,標誌意思可以從其名字中略知一二,而具體用法,後面將在運用到的時候加以介紹
渲染:運用ID3DXSprite渲染2D圖形其實好簡單,只需調用ID3DXSprite::Draw介面,該介面原型如下:
HRESULT Draw(
LPDIRECT3DTEXTURE9 pTexture,
CONST RECT * pSrcRect,
CONST D3DXVECTOR3 * pCenter,
CONST D3DXVECTOR3 * pPosition,
D3DCOLOR Color
);
其中 參數一為精靈所用到的紋理。
參數二為要渲染的紋理矩形地區,意思上就像DirectDraw中所說的原位元影像矩形(指明要將紋理的哪一部分渲染到螢幕上)
參數三要求傳入紋理的中心點座標,如果傳入NULL則表明使用預設值,預設值為將紋理的左上方設為中心點。中心點的設定將關係到日後對精靈進行位移,旋轉的效果
參數四為精靈在螢幕上的渲染位置,如要在螢幕的(100,100)像素位置渲染精靈,則應傳入&D3DXVECTOR3(100.0f, 100.0f, 0.0f),其實參數三加參數四可以簡單的理解為DirectDraw中所說的目的地矩形
參數五要求傳入一個32位顏色值,在渲染時,紋理上的每一個像素的顏色值將與其進行相乘,得到最後的渲染顏色,如傳入0x00000000,相乘後顏色值將為0,所以精靈將以全黑色渲染,這個參數還有一個用處,就是控制精靈的透明值:當使用者在調用ID3DXSprite::Begin時傳入D3DXSPRITE_ALPHABLEND標誌,則表明開啟精靈透明渲染功能,此時參數五的高8位用於指明渲染的透明度,例如:要完全不透明的渲染映像,應傳入0xffffffff,要完全透明的渲染映像,應傳入0x00ffffff。
精靈位移,縮放,旋轉等處理:可以通過調用ID3DXSprite::SetTransform實現,此介面要求傳入一個變換矩陣,注意:這裡的變換矩陣指的是變換2D平面上的座標,而非我們平時常用的3D變換矩陣,2D平面變換矩陣應該調用函數D3DXMatrixTransformation2D得到,該函數的使用方法請參照DirectX9.0協助檔案。
下面附上部分代碼,大概實現效果為:在螢幕的(100,100)座標處渲染一個2D精靈,該精靈被縮小為原來的十分之一,並附帶0.5孤度的旋轉,透明度為60%左右
//初始化精靈對像
D3DXCreateSprite(g_pDevice, &g_pSprite);
g_pDevice->BeginScene();
g_pDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL,
D3DCOLOR_XRGB(0,0,0),1.0f,0L);
g_pSprite->Begin(D3DXSPRITE_ALPHABLEND);
//得到2D座標轉換矩陣
D3DXMatrixTransformation2D(&mat, NULL, 0.0f, &D3DXVECTOR2(0.1f, 0.1f),
&D3DXVECTOR2(50.0f, 50.0f), 0.5f, &D3DXVECTOR2(100.0f, 100.0f));
g_pSprite->SetTransform(&mat);
//渲染精靈
g_pSprite->Draw(g_ptexSprite, NULL, NULL, NULL, 0x99ffffff);
g_pSprite->End();
g_pDevice->EndScene();
g_pDevice->Present(NULL, NULL, NULL, NULL);
-------------------------------------------------------------------------------------------------------------------------------------
定義一個ID3DXSprite*變數:
ID3DXSprite* pSprite = NULL;
然後在建立D3D裝置(假如是pd3dDevice)之後, 用D3DXCreateSprite建立Sprite:
D3DXCreateSprite( pd3dDevice, &pSprite );
記得在裝置丟失/釋放時使用: SAFE_RELEASE( pSprite );
在渲染情境的時候, 使用:
pSprite->Begin(x);
... // 具體繪製代碼
pSprite->End();
其中的x可以是下面各值的組合, 如 D3DXSPRITE_ALPHABLEND | D3DXSPRITE_OBJECTSPACE
D3DXSPRITE_DONOTSAVESTATE 調用Begin()或End()不儲存/恢複裝置狀態. (如pd3dDevice->SetRenderState中設定的部分狀態)
D3DXSPRITE_DONOTMODIFY_RENDERSTATE 不是很清楚, 呵呵, 表面上看好像是不改變渲染狀態...
D3DXSPRITE_OBJECTSPACE 不改變世界矩陣(WORLD)/投影矩陣(TRANSFORM)以及視點矩陣(VIEW), 使用設定在D3DDevice上的矩陣, 如果不指定這個標誌, 3個矩陣自動改變為螢幕空間座標
D3DXSPRITE_BILLBOARD BillBoard, 很清楚吧, 所有的Sprite都全部自動旋轉來對著觀看著
D3DXSPRITE_ALPHABLEND 讓Sprite支援AlphaBlend, 很重要, 幾乎每次調用Begin都要指定此標誌, 另外, D3DRS_ALPHATESTENABLE 狀態必須設定為 TRUE, D3DBLEND_SRCALPHA / D3DBLEND_INVSRCALPHA 分別為源混和狀態和目標很合狀態
D3DXSPRITE_SORT_TEXTURE Sprite會按照渲染先後排序, 當渲染在同一個深度的Sprite推薦使用.
D3DXSPRITE_SORT_DEPTH_FRONTTOBACK 按照從前到後的渲染順序對Sprite排序, 當在不同深度渲染有透明資訊的Sprite時推薦使用.
D3DXSPRITE_SORT_DEPTH_BACKTOFRONT 按照從後到前的渲染順序對Sprite排序, 當在不同深度渲染透明Sprite時推薦使用
一般就是D3DXSPRITE_ALPHABLEND, 或者根據需要再加上D3DXSPRITE_OBJECTSPACE, 其他的我都不怎麼用.....
中間的繪製代碼使用 pSprite->Draw, 函數原型為:
HRESULT Draw(
LPDIRECT3DTEXTURE9 pTexture,
CONST RECT *pSrcRect,
CONST D3DXVECTOR3 *pCenter,
CONST D3DXVECTOR3 *pPosition,
D3DCOLOR Color );
pTexture 是需要繪製的貼圖
pSrcRect 是需要繪製的貼圖上的一個矩形地區, 繪製整過貼圖可以指定為NULL.
pCenter 是繪製的中心座標(旋轉時會以此點為中心), 指定NULL表示中心座標為(0,0,0)
pPosition 是繪製的位置座標, 也可以指定NULL表示(0,0,0)
Color 是繪製的顏色, 一般情況下指定為 0xffffffff. 最高位到底位的各8位元組為Alpha, 紅, 綠, 藍, 如果指定 0x80ffffff就是半透明貼圖. 如果0xffff0000就只保留貼圖裡的紅色分量, 具體功能自己體會. 當然貼圖本身可以包含Alpha資訊.
需要旋轉等功能可以使用 pSprite->SetTransform(), 函數原型為:
HRESULT SetTransform( CONST D3DXMATRIX *pTransform );
相信這個不用解釋都很清楚了吧.
最後再提醒一點: pSprite->Begin和pSprite->End 必須成對的出現在 IDirect3DDevice9::BeginScene 和 IDirect3DDevice9::EndScene 之間.
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/wind2006/archive/2010/07/14/5734217.aspx