寬度與間距 (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。

直接存取表面時,請小心保留在配置給表面維度的記憶體內,並保留任何保留給快取的記憶體。 此外,當您只鎖定表面的一部分時,您必須停留在鎖定表面時所指定的矩形內。 無法遵循這些指導方針將會產生無法預期的結果。 直接轉譯成表面記憶體時,請一律使用 IDirect3DSurface9::LockRect 方法傳回的音調。 請勿只根據顯示模式來假設音調。 如果您的應用程式在某些顯示器介面卡上運作,但在其他顯示器介面卡上看起來很模糊,這可能是問題的原因。

如需詳細資訊,請參閱 直接 (Direct3D 9) 存取 Surface 記憶體

Direct3D 表面