ID3DXSprite

来源:互联网 发布:安义县华宇网络 编辑:程序博客网 时间:2024/04/26 03:43

前言:本教程面向对DriectX 9.0有一定了解的读者,主要讲解DirectX 9.0的各个部分的功能及用法。希望对广大的游戏初学者有一定帮助,也好让本人对中国游戏事业的发展做出一些微不足道的贡献。作者:Fabric(由于本人是广东人,写文章难免参杂粤语写法,请见谅)

 

  简介: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 之间.