轉:ID3DXSprite簡介

來源:互聯網
上載者:User

簡介: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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.