宽度与间距 (Direct3D 9)

尽管“宽度”和“音调”这两个术语经常被非正式使用,但它们具有非常重要且明显不同的含义。 因此,你应该了解每个的含义,以及如何解释 Direct3D 用来描述它们的值。

Direct3D 使用 D3DSURFACE_DESC 结构来携带描述图面的信息。 除其他事项外,此结构定义为包含有关图面尺寸的信息,以及这些维度在内存中的表示方式。 结构使用 Height 和 Width 成员来描述图面的逻辑维度。 这两个成员都以像素为单位。 因此,无论是 8 位图面还是 24 位 RGB 图面,640 x 480 表面的 Height 和 Width 值都是相同的。

使用 IDirect3DSurface9::LockRect 方法锁定图面时,该方法将填充包含图面间距和指向锁定位的指针 的D3DLOCKED_RECT 结构。 Pitch 成员中的值描述表面的内存间距,也称为步幅。 间距是两个内存地址之间的距离(以字节为单位),表示一个位图行的开头和下一个位图行的开头。 由于间距以字节而不是像素为单位,因此 640x480x8 表面的俯仰值与具有相同尺寸但像素格式不同的图面非常不同。 此外,间距值有时反映 Direct3D 保留为缓存的字节,因此假定音调只是宽度乘以每个像素的字节数是不安全的。 相反,请可视化宽度和间距之间的差异,如下图所示。

同一前缓冲区、后缓冲区和缓存的间距和宽度示意图

在此图中,前缓冲区和后台缓冲区均为 640x480x8,缓存为 384x480x8。

在直接访问图面时,请注意保留在为图面尺寸分配的内存中,并远离为缓存保留的任何内存。 此外,如果仅锁定图面的一部分,则必须停留在锁定图面时指定的矩形内。 如果不遵循这些准则,将产生不可预知的结果。 直接呈现到 Surface 内存中时,始终使用 IDirect3DSurface9::LockRect 方法返回的音调。 不要假设仅基于显示模式的音高。 如果应用程序在某些显示适配器上工作,但在其他显示适配器上看起来乱码,这可能是问题的原因。

有关详细信息,请参阅 直接访问 Surface Memory (Direct3D 9)

Direct3D Surfaces