前言:本教程面向对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 之间.
简介: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 之间.