在 DirectX 8 及以上版本中使用 ID3DXSprite 绘制 2D 图形






2.74/5 (13投票s)
本教程演示了如何使用 ID3DXSprite 在 DirectX 8 中渲染 2D 图像。

引言
最近玩了几款游戏(很久没玩了),我想我应该学习制作游戏,因为编写游戏涉及许多有趣的挑战。
本教程演示了在 DirectX 8 及以上版本中绘制 2D 图像是多么容易,在这些版本中 DirectDraw
不再可用。
为什么要有本教程?
为什么我们需要知道如何在 DirectX 8 中绘制 2D 图形? 一个主要原因是,从 DirectX 8 开始,DirectX 7 之前可用的 DirectDraw 组件已不再存在。 微软的官方文档说,DirectX 8 之于 DirectX 7 就像 Windows 95 之于 Windows 3.11。 从 DirectX 8 开始,重点更多地放在 3D 而不是 2D 上,因此他们将 2D 与 3D 合并。
由于我开始学习 DirectX,我认为 2D 是一种更好的开始方式,然后再深入研究 3D 的复杂性。 我在互联网上搜索了任何好的例子来在 DirectX 中渲染 2D 图形,但大多数示例都使用了 DirectDraw
。 从 DirectX 8 开始,DirectDraw
的支持很少,而且我猜 DirectX 8 SDK 中也没有 DirectDraw
的文档。
ID3DXSprite
我遇到了这个新的接口 ID3DXSprite
,它是 Direct3DX
的一部分。 我试图寻找一个使用这个接口的好例子,但找不到。 即使 DirectX 提供的示例也没有。 所以我做了一些实验,并提出了这个例子。 所以我认为在这里发布出来对任何想使用 DirectX 8 进行 2D 绘制并且不使用 DirectDraw
的人来说是个好主意。
关于 ID3DXSprite 的几件事
- 有人说这个接口很慢,有些人喜欢用四边形以自己的方式渲染 2D 图形。 我要说的是没有必要重新发明轮子。 这个接口非常高效,并且很好地完成了任务。
- 在 DirectX 9 中,您也可以使用此接口进行 alpha 混合。
- 不要被接口名称搞混。 这个接口与精灵关系不大,它只是绘制一个 2D 图像。
ID3DXSprite
速度很快,所以随时使用它。- 一个
ID3DXSprite
实例可以用于渲染应用程序中的所有 2D 图像。 无需为每个精灵图像创建许多ID3DXSprite
实例。
关于 ID3DXSprite 的一点知识?
The three important methods are
Begin - Prepares the interface to draw a texture.
This should be always called before drawing.
Draw - Draws the sprite.
HRESULT Draw(
LPDIRECT3DTEXTURE8 pSrcTexture, // The texture to draw.
CONST RECT* pSrcRect, // The src rect
CONST D3DXVECTOR2* pScaling, // Scaling
CONST D3DXVECTOR2* pRotationCenter, // The rotation center if rotation is used.
FLOAT Rotation, // Rotatino in radians.
CONST D3DVECTOR2* pTranslation, // Translation, i.e. moving the object to this place.
D3DCOLOR Color // Color to module the image pixels.
);End - Ends the sprite drawing and restores any settings used to render the texture.
如何使用 ID3DXSprite?
通常一个接口足以渲染所有 2D 图像,除非您有特定的原因要创建更多。 D3DXCreateSprite(...)
用于创建 ID3DXSprite
的一个实例。
使用任何一种技术加载纹理。
渲染顺序。
...
g_d3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
g_d3dDevice->BeginScene();
{
g_pSprite->Begin();
{
g_pSprite->Draw(g_pTexture,NULL,NULL,NULL,0,&g_position,0xFFFFFFFF);
}
g_pSprite->End();
}
g_d3dDevice->EndScene();
g_d3dDevice->Present( NULL, NULL, NULL, NULL );
关于示例
附带的示例代码非常简单易读。 除了使用接口绘制精灵之外,它什么也没做。
示例在窗口周围弹跳球。
希望您觉得本教程有用。