您的位置:首页 > 其它

【转载】ID3DXSPRITE接口简单使用

2016-06-04 21:59 459 查看
原文:ID3DXSPRITE接口简单使用

前些日子一直研究DDraw,毕竟是DirectX7的东西了,所以转手用DirectD3D9,用了Surface进行绘图,可是怎么做透明色也都是不行loadfromfile透明部分就成了不透明黑色,我晕.....哎~网上有几位兄弟也是从DDraw转过来的,好像都有这个问题,实在没办法只能转用ID3dXSprite接口和纹理了,网上看到一篇文章还算讲得清晰,特此借用,勿怪^_^

源地址 http://blog.csdn.net/tinya0913/archive/2011/01/08/6124024.aspx

ID3dXSprite接口

HRESULT Draw( LPDIRECT3DTEXTURE9 pTexture,

CONST RECT * pSrcRect,

CONST D3DXVECTOR3 * pCenter,

CONST D3DXVECTOR3 * pPosition,

D3DCOLOR Color);

在2D游戏中,由于去掉了深度这一个"D",所以无论视点离物体的远近程度如何,其呈现的物体大小是不会改变的。

那么使用D3D制作2D游戏,怎样才能实现这种与深度无关的效果呢?关键就在于投影变换时不要建立透视投影变换矩阵,而要使用函数D3DXMatrixOrthoLH或者D3DXMatrixOrthoOffCenterLH建立正交投影矩阵。关于这两个函数的用法将在后面的章节进行详细地讨论。

使用ID3DXSprite接口渲染2D精灵

ID3DXSprite接口提供了一系列函数帮助程序员使用D3D渲染2D精灵。使用ID3DXSprite接口的典型步骤是:

通过D3DXCreateSprite函数得到指向ID3DXSprite接口的指针

调用ID3DXSprite::Begin函数准备渲染状态

调用ID3DXSprite::SetTransform函数设置精灵的世界坐标系变换(包括缩放、旋转和平移)

调用ID3DXSprite::Draw函数将精灵显示在屏幕上

创建D3DXSprite对象

要使用ID3DXSpirte,首先需要使用D3DXCreateSprite函数创建D3DXSprite对象。D3DXCreateSprite函数将使用当前的3D设备,创建一个Sprite对象,并返回指向这个Sprite对象的指针。其函数原型如下:

HRESULT D3DXCreateSprite(

LPDIRECT3DDEVICE9 pDevice,

LPD3DXSPRITE * ppSprite

);

下面的代码段展示如何创建一个D3DXSprite对象, 并得到指向这个对象的指针。在这段代码里假设pD3DDevice是已经创建好的D3D设备指针。

……

LPD3DXSPRITE pSprite;

if (FAILED(D3DXCreateSprite(

pD3DDevice,&pSprite)))

{

return;

}

……

准备渲染状态

用ID3DXSprite接口,可以通过调用Beign函数来设置渲染状态。Begin函数的原型如下:

HRESULT Begin(

DWORD Flags

);

在2D游戏中,最常用的参数是D3DXSPRITE_ALPHABLEND,它表示将要打开Alpha混合开关,实现精灵的透明渲染。在3D游戏中常用到D3DXSPRITE_ALPHABLEND |D3DXSPRITE_BILLBOARD这两个值的组合来实现粒子系统。在本章中,关注的是2D游戏制作,所以将只用到D3DXSPRITE_ALPHABLEND。

通过调用Begin函数,D3D设备做好了渲染的准备,接下来就可以执行渲染的工作。不过,Begin函数应该和End函数成对出现,渲染的操作应该放在Being函数和End函数之间。End函数原型如下:

HRESULT End();

通过End函数调用,D3D设备会将渲染的内容提交给设备显示出来。值得注意的是,ID3DXSprite接口提供的Begin/End函数并不能取代BeginSecne/EndScene函数,而是应该放在它们之间,如下;

……

if( SUCCEEDED( pD3DDevice->BeginScene() ) )

{

……

pSprite->Begin(

D3DXSPRITE_ALPHABLEND);

……

pSprite->End();

…..

pD3DDevice->EndScene();

}

……

设置精灵的世界坐标系变换

世界变换包括了缩放、旋转、平移等操作。对于这些操作,可以使用D3DXMatrixScaling函数、D3DXMatrixTranslation函数、D3DXMatrixRotationZ计算出相应的变换矩阵,再用D3DXMatrixMultiply函数按一定的变换顺序将它们累积起来。然后使用D3DXSprite对象的SetTransform函数设置精灵的世界变换。如下面的代码段,将精灵在x、y方向等比例缩放为原来的0.5倍,然后绕着Z轴旋转1弧度,再平移到(x,y,0)处:

……

D3DXMATRIX matScale,matRotation,matTrans,matWorld;

D3DXMatrixScaling(&matScale, 0.5f, 0.5f, 1.0f);

D3DXMatrixRotationZ(&matRotation,1.0);

D3DXMatrixTranslation (&matTrans,x,y,0);

D3DXMatrixMultiply(&matWorld,&matScale,

&matRotation);

D3DXMatrixMultiply(&matWorld,&matWorld,

&matTrans);

pSprite->SetTransform(&matWorld);

……

在屏幕指定位置渲染

使用D3DXSprite对象渲染时,其坐标系是以屏幕左上角为坐标原点,沿原点向左是X坐标增大的方向,沿原点向下是y坐标增大的方向。D3DXSprite的绘图操作必须放在D3DXSprite对象的Begin()/End()函数对之间完成。在调用其Begin函数时可以同时指定精灵渲染时的行为(比如打开Alpha混合开关),而具体的操作则交给Draw函数来完成。其函数原型如下:

下面的代码段在x,y,z位置渲染精灵:

……

//打开渲染开关,同时打开Alpha混合开关

pSprite->Begin(D3DXSPRITE_ALPHABLEND);

HRESULT hr = pSprite->Draw(pTexture,

NULL,

NULL, &D3DXVECTOR3(x,y,z),

0xFFFFFFFF

);

pSprite->End();

……

注意:ID3DXSprite接口是微软为了帮助程序员轻松实现2D游戏而准备的,所以,在使用ID3DXSprite接口时,不需要由程序员建立投影坐标系、观察坐标系,也不需要创建顶点缓冲及定义顶点数据结构和灵活顶点格式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: