|
|
建立D3D和其他相关的设备应该没有问题吧.4 B$ S" h6 y- ]9 T6 S# n
然后再定义一个ID3DXSprite*变量:" }4 e$ G& n5 C% y9 d7 `
ID3DXSprite* pSprite = NULL; * {7 I2 e) C& R6 j! D
然后在创建D3D设备(假如是pd3dDevice)之后, 用D3DXCreateSprite创建Sprite:( d) C' }% C4 M% N4 \
D3DXCreateSprite( pd3dDevice, &pSprite );
! t9 j* ~8 h: E% N5 M 记得在设备丢失/释放时使用: SAFE_RELEASE( pSprite );! W& X1 ]7 T# A# Y
在渲染场景的时候, 使用:
]7 q# |; z+ P5 a& T( S. j pSprite->Begin(x);
5 D* U, s3 i# ~7 p/ a- s s ... // 具体绘制代码
0 }$ C' j4 M7 e pSprite->End();
! V. a+ z( W7 S$ K* Z; k8 W7 Q 其中的x可以是下面各值的组合, 如 D3DXSPRITE_ALPHABLEND | D3DXSPRITE_OBJECTSPACE
2 `0 f- ?- w2 r( |5 \ D3DXSPRITE_DONOTSAVESTATE 调用Begin()或End()不保存/恢复设备状态. (如pd3dDevice->SetRenderState中设置的部分状态)
, |/ U2 ~4 n9 Y: x& `3 [) m D3DXSPRITE_DONOTMODIFY_RENDERSTATE 不是很清楚, 呵呵, 表面上看好像是不改变渲染状态...
. n; G) Y$ P6 i& O! G$ H D3DXSPRITE_OBJECTSPACE 不改变世界矩阵(WORLD)/投影矩阵(TRANSFORM)以及视点矩阵(VIEW), 使用设置在D3DDevice上的矩阵, 如果不指定这个标志, 3个矩阵自动改变为屏幕空间座标6 ]2 y) f0 L. A
D3DXSPRITE_BILLBOARD BillBoard, 很清楚吧, 所有的Sprite都全部自动旋转来对着观看着% c4 @8 C# y6 m, [* U( y2 X! C1 a
D3DXSPRITE_ALPHABLEND 让Sprite支持AlphaBlend, 很重要, 几乎每次调用Begin都要指定此标志, 另外, D3DRS_ALPHATESTENABLE 状态必须设置为 TRUE, D3DBLEND_SRCALPHA / D3DBLEND_INVSRCALPHA 分别为源混和状态和目标很合状态) o/ p& Z5 w, E. i
D3DXSPRITE_SORT_TEXTURE Sprite会按照渲染先后排序, 当渲染在同一个深度的Sprite推荐使用.
1 G7 ~5 {% ` J1 A! q D3DXSPRITE_SORT_DEPTH_FRONTTOBACK 按照从前到后的渲染顺序对Sprite排序, 当在不同深度渲染有透明信息的Sprite时推荐使用.1 B- k. g5 I% I0 u' j+ _ G; B3 o
D3DXSPRITE_SORT_DEPTH_BACKTOFRONT 按照从后到前的渲染顺序对Sprite排序, 当在不同深度渲染透明Sprite时推荐使用
2 w/ R0 h6 g. A, H; ] 一般就是D3DXSPRITE_ALPHABLEND, 或者根据需要再加上D3DXSPRITE_OBJECTSPACE, 其他的我都不怎么用.....
8 z4 D/ U8 r! _# h2 N3 \& J 中间的绘制代码使用 pSprite->Draw, 函数原型为:- C2 q0 s' ~* `4 m6 @0 w
HRESULT Draw(3 {, M$ q# O" M9 N+ S/ b0 P8 P2 b
LPDIRECT3DTEXTURE9 pTexture,: S" ?' g" @1 o8 G
CONST RECT *pSrcRect,: U3 s! r! S5 d" i( T; d
CONST D3DXVECTOR3 *pCenter,
, a: G" ^5 C E CONST D3DXVECTOR3 *pPosition, Q% w* \: u2 s/ W# n; u7 o
D3DCOLOR Color );) r% R) i% n' y. S
pTexture 是需要绘制的贴图' r5 y& Z: p! K
pSrcRect 是需要绘制的贴图上的一个矩形区域, 绘制整过贴图可以指定为NULL.
) K* x0 D; h# L4 Y; J, f$ n0 C pCenter 是绘制的中心座标(旋转时会以此点为中心), 指定NULL表示中心座标为(0,0,0)( N6 w& ?+ v8 X; g. D: p% f4 ^! u
pPosition 是绘制的位置座标, 也可以指定NULL表示(0,0,0)
& I/ p* N$ g1 v7 v9 ~6 R# x I, Q# r( ~ Color 是绘制的颜色, 一般情况下指定为 0xffffffff. 最高位到底位的各8字节为Alpha, 红, 绿, 蓝, 如果指定0x80ffffff就是半透明贴图. 如果0xffff0000就只保留贴图里的红色分量, 具体功能自己体会. 当然贴图本身可以包含Alpha信息.) o! W; g3 m$ k( q+ a8 p+ M/ S/ W ^
需要旋转等功能可以使用 pSprite->SetTransform(), 函数原型为:6 r F6 n' H6 o2 w0 Q4 a; L
HRESULT SetTransform( CONST D3DXMATRIX *pTransform );
% e* X4 G H) w. d 相信这个不用解释都很清楚了吧.
$ A' c% K, G9 C6 U" Y 最后再提醒一点: pSprite->Begin和pSprite->End 必须成对的出现在 IDirect3DDevice9::BeginScene 和 IDirect3DDevice9::EndScene 之间.0 z# e! }' i" P4 W; U. {
4 N) B1 c# b+ A3 c
原文出处:http://www.dingge.com/forum/dv_rss.asp?s=xml&boardid=46&id=5581&page=1 |
|