DirectX 游戏的 2D 图形

我们将讨论 2D 位图图形的使用和效果,以及如何在游戏中使用它们。

2D 图形是 3D 图形的子集,用于处理 2D 基元或位图。 更一般地说,它们不像 3D 那样使用 z 坐标,因此游戏的执行通常限制在 x-y 平面。 它们有时使用 3D 图形技术创建其视觉组件,而且它们的开发一般比较简单。 如果你是游戏开发新手,则最好从 2D 游戏开始,而且 2D 图形开发也是在 DirectX 上操作的良好开端。

你可以使用 Direct2D 或 Direct3D 或者一些组件在 DirectX 中开发 2D 游戏图形。 用于 2D 游戏开发的许多较有用的类(如 Sprite 类)都在 Direct3D 中。 Direct2D 是一组 API,主要定位到需要绘制基元(如圆、线和平面多边形)支持的用户界面和应用。 除此之外,它还为创建游戏图形提供了一组功能强大和性能优异的类和方法,尤其是创建游戏覆盖层、界面和抬头显示 (HUD) 时 - 或用于创建从简单到相当详细的各种 2D 游戏。 但创建 2D 游戏最有效的方法是使用两个库中的元素,这是本主题中处理 2D 图形开发的方法。

概念概览

在现代 3D 图形和支持它的硬件出现之前,游戏主要是 2D 形式,并且其许多图形技术涉及移动内存块 - 通常是颜色数据数组,将以 1:1 的方式平移或转换为屏幕上的像素。

在 DirectX 中,2D 图形是 3D 管道的一部分。 存在大量不同类型的屏幕分辨率和图形硬件,你的 2D 图形引擎必须能够支持它们,且不会使保真度发生明显变化。

下面是在开始 2D 图形开发时应熟悉的一些基本概念。

  • 像素和光栅坐标。 像素是光栅显示屏上的单一点,有自己的 (x, y) 坐标对,指示其在显示屏上的位置。 (术语“像素”通常与物理像素互换使用,后者包括显示屏和在发送到显示屏之前用于保存像素颜色和 Alpha 值的可寻址内存元素。)API 将光栅视为像素元素的矩形网格,通常与显示屏的物理像素网格具有一一对应关系。 光栅坐标系从左上角开始,网格最左上角的像素在 (0, 0)。
  • 位图图形(有时称为光栅图形)是表示为像素值矩形网格的图形元素。 子画面 - 独立于光栅管理的计算出的像素数组 - 是位图图形的一种类型,常用于游戏中的活动人物或独立于背景的动画对象。 子画面的各种动画帧表示为称为“工作表”或“批处理”的位图集合。背景是较大的位图对象,其分辨率与屏幕光栅的分辨率相同或更高,通常用作游戏场地的背景。
  • 矢量图形是使用几何图形基元(如点、线、圆和多边形)定义 2D 对象的图形。 它们不表示为像素的数组,而表示为在 2D 空间中定义它们的数学公式。 它们不一定与显示的像素网格具有一一对应的关系,并且必须从呈现它们的坐标系转换为显示的光栅坐标系。
  • 平移是采用点或顶点并计算其同一坐标系中的新位置。
  • 缩放是通过指定比例系数放大或缩小对象。 对于矢量图像,是缩小和放大其组件顶点;对于位图,是放大像素元素或减损像素元素。 对于位图图像,当图像缩小时会丢失像素数据,当图像的放大较接近时,是放大个别像素。 对于后者,你可以使用像素颜色内插操作(双线性筛选)来平滑处理放大像素之间尖锐的颜色边界。
  • 旋转是绕指定的一轴或多轴旋转对象。 对于矢量图像,几何图形的顶点乘以旋转矩阵可获取旋转后的顶点;对于位图图像,可以使用不同的算法,每种算法都会在结果中产生或多或少的失真度。 对于缩放和平移,有专门用于旋转操作的 API。
  • 转换是采用一个坐标系中的点或顶点并计算其在另一坐标系中对应的点或顶点。 这包括平移、缩放和旋转,以及其他坐标计算操作。
  • 剪切是删除不在显示屏可视区域内或被较高视图优先级的对象隐藏的位图或几何图形部分。
  • 帧缓冲区是内存中的一个区域(通常在图形硬件本身的内存中),其中包含要绘制到屏幕上的最终光栅映射。 交换链是一个缓冲区集合,在这里绘入一个后台缓冲区,当准备好图像时,将其“交换”到前台并显示出来。

设计注意事项

2D 图形开发是熟悉使用 Direct3D 开发的良好方法,并且可让你将更多的时间用在游戏开发的其他关键方面:音频、控件和游戏机制。

始终绘制到后台缓冲区。 直接绘制到帧缓冲区意味着你的图像将在收到显示信号时显示(通常是每 1/60 秒),即使绘制操作未完成也会显示!

设计你的图形引擎以较好地支持分辨率选择(从 1024x600 到 1920x1080 或更高)。 如果你支持游戏玩家的 LCD 监视器的本机分辨率(尤其是 2D 图形),他们会非常开心。

对于视觉效果而言,优秀的艺术作品就是你的最大资产。 尽管你的位图图形可能缺少使用最新着色器模型功能的 3D 效果带来的视觉冲击力,但高分辨率的艺术作品通常可以传达同样或更多的风格和个性 - 且性能损失要低得多。

参考