跳转至

使用 Z 缓冲渲染

包括 Direct3D 在内的大多数图形引擎都支持 Z 缓冲,这是一种确保场景中有重叠对象时只绘制顶部对象的方法。Z 缓冲的工作原理是把场景「绘制」到一个二维数组,描述屏幕上每个像素处的对象离观看者有多近。把数组索引想象成坐标轴:它们对应屏幕上每个像素的 x 轴(左右)和 y 轴(上下)。数组中存储的每个值是一个像素的 z 轴值。

新对象出现时,它是否实际绘制在屏幕上由 Z 缓冲数组决定。如果对象 x 和 y 位置处的位置已经在数组中填充,意味着屏幕上该像素处已有另一个对象。只有在新对象的 z 轴值低于(即更靠近观看者)该像素已有的值时,它才会出现。场景绘制到数组完成后,它被刷新到屏幕。

为了说明这一点,想象一个三维空间,某个游戏需要把它绘制到二维画布上,视口是 4×4 像素。这个场景的 Z 缓冲看起来像图 9-1。

首先,游戏绘制一个完全填充视口、位于 z 轴尽可能远的蓝色背景;假设最高 z 值是 100。接下来,游戏在位置 (0,0) 绘制一个 z 位置为 5 的 2×2 像素红色矩形。最后,游戏在位置(1,1) 绘制一个 z 位置为 3 的 2×2 像素绿色矩形。Z 缓冲现在看起来像图 9-2。

Z 缓冲根据对象的 z 位置整齐地处理重叠对象。z 轴上最近的绿色方块重叠了稍远的红色方块,两个方块都重叠了非常远的蓝色背景。

图 9-1 空的 Z 缓冲

图 9-2 填充后的 Z 缓冲

这种行为让游戏可以绘制地图、玩家、生物、细节粒子,而不用担心玩家实际能看到什么。这对游戏开发者来说是巨大的优化,但它暴露了一大片攻击面。由于所有游戏模型总是交给图形引擎,你可以用钩子检测玩家实际上看不到的对象。