|
建立D3D和其他相关的设备应该没有问题吧.& l. Z' D0 n; o; N9 e
然后再定义一个ID3DXSprite*变量:8 \! j2 B0 V$ b9 n) c4 ?
ID3DXSprite* pSprite = NULL;
' @) _6 B0 V M! [- V 然后在创建D3D设备(假如是pd3dDevice)之后, 用D3DXCreateSprite创建Sprite:2 s1 ?9 y2 R. E; ]* z1 m7 M
D3DXCreateSprite( pd3dDevice, &pSprite );
( k$ I u5 o k: c: { 记得在设备丢失/释放时使用: SAFE_RELEASE( pSprite );6 ^' q1 C- ]0 _! o) e
在渲染场景的时候, 使用:
* y# r u3 C. C. X% f3 m pSprite->Begin(x);
+ x% k% y8 Q4 ?( ^: J6 S8 }3 o ... // 具体绘制代码3 I2 Z' x0 R$ f: @' s& P3 h3 p
pSprite->End();
8 Y! u+ g: i" O1 @& i7 w 其中的x可以是下面各值的组合, 如 D3DXSPRITE_ALPHABLEND | D3DXSPRITE_OBJECTSPACE9 N- a5 O* p0 W. r. Z; l
D3DXSPRITE_DONOTSAVESTATE 调用Begin()或End()不保存/恢复设备状态. (如pd3dDevice->SetRenderState中设置的部分状态)
% H2 ?3 R* v/ q8 ]( | D3DXSPRITE_DONOTMODIFY_RENDERSTATE 不是很清楚, 呵呵, 表面上看好像是不改变渲染状态...
1 \& R f) [! c* c; [9 a' e/ E D3DXSPRITE_OBJECTSPACE 不改变世界矩阵(WORLD)/投影矩阵(TRANSFORM)以及视点矩阵(VIEW), 使用设置在D3DDevice上的矩阵, 如果不指定这个标志, 3个矩阵自动改变为屏幕空间座标; k5 l' p+ W x% C/ |+ n; ~
D3DXSPRITE_BILLBOARD BillBoard, 很清楚吧, 所有的Sprite都全部自动旋转来对着观看着
J5 n3 C ~, ^3 p D3DXSPRITE_ALPHABLEND 让Sprite支持AlphaBlend, 很重要, 几乎每次调用Begin都要指定此标志, 另外, D3DRS_ALPHATESTENABLE 状态必须设置为 TRUE, D3DBLEND_SRCALPHA / D3DBLEND_INVSRCALPHA 分别为源混和状态和目标很合状态5 c, J ]! b, W/ D; N" H' l# ?
D3DXSPRITE_SORT_TEXTURE Sprite会按照渲染先后排序, 当渲染在同一个深度的Sprite推荐使用. p; E$ ]/ m- L: ~. v
D3DXSPRITE_SORT_DEPTH_FRONTTOBACK 按照从前到后的渲染顺序对Sprite排序, 当在不同深度渲染有透明信息的Sprite时推荐使用.
* y" I* d; z9 s6 ? D3DXSPRITE_SORT_DEPTH_BACKTOFRONT 按照从后到前的渲染顺序对Sprite排序, 当在不同深度渲染透明Sprite时推荐使用
# r& }. r4 V8 i% u1 |" E 一般就是D3DXSPRITE_ALPHABLEND, 或者根据需要再加上D3DXSPRITE_OBJECTSPACE, 其他的我都不怎么用.....$ A: f# p" b, y$ M9 e+ j
中间的绘制代码使用 pSprite->Draw, 函数原型为:
6 L* S, ], _6 P D& Q9 | HRESULT Draw(9 O# A/ k, n( e
LPDIRECT3DTEXTURE9 pTexture,0 B& r6 ^8 S: A% B5 Z
CONST RECT *pSrcRect,
0 O, i+ h% v8 C) |; { k* J6 H CONST D3DXVECTOR3 *pCenter,
8 z4 T2 ~# u. z CONST D3DXVECTOR3 *pPosition,
. ^4 q# M; s5 @3 H5 e7 P8 U D3DCOLOR Color );
3 u. {, U3 \6 `' c pTexture 是需要绘制的贴图
1 c, ]+ t G9 F: Q! w pSrcRect 是需要绘制的贴图上的一个矩形区域, 绘制整过贴图可以指定为NULL.
3 {* K+ O+ g9 }0 m' M6 [6 Z( g pCenter 是绘制的中心座标(旋转时会以此点为中心), 指定NULL表示中心座标为(0,0,0)8 b. D- p: T- q1 e2 x
pPosition 是绘制的位置座标, 也可以指定NULL表示(0,0,0)' P6 U1 L+ G2 T
Color 是绘制的颜色, 一般情况下指定为 0xffffffff. 最高位到底位的各8字节为Alpha, 红, 绿, 蓝, 如果指定0x80ffffff就是半透明贴图. 如果0xffff0000就只保留贴图里的红色分量, 具体功能自己体会. 当然贴图本身可以包含Alpha信息.
% n- Z6 S( P) Y/ W" } 需要旋转等功能可以使用 pSprite->SetTransform(), 函数原型为:) `9 j' v% k4 ^2 b, Y
HRESULT SetTransform( CONST D3DXMATRIX *pTransform );
* c) o+ h0 \6 T0 J 相信这个不用解释都很清楚了吧.
/ ]6 u* h4 c; L7 B1 G 最后再提醒一点: pSprite->Begin和pSprite->End 必须成对的出现在 IDirect3DDevice9::BeginScene 和 IDirect3DDevice9::EndScene 之间.; P1 l3 b# c, B5 U* [" a1 F
7 `3 M! F, @. t( P1 H
原文出处:http://www.dingge.com/forum/dv_rss.asp?s=xml&boardid=46&id=5581&page=1 |
|