[新手学3D]Width 和 Pitch(Direct3D 9)

术语width和pitch(间距,位移,跨度)通常被非正式的使用,但是他们是很重要的,而且是明显不同的。所以应该搞清楚他们各自的意思。

Direct3D使用D3DSURFACE_DESC结构体来存储描述一个surface的信息。

typedef struct D3DSURFACE_DESC {
    D3DFORMAT Format;
    D3DRESOURCETYPE Type;
    DWORD Usage;
    D3DPOOL Pool;
    D3DMULTISAMPLE_TYPE MultiSampleType;
    DWORD MultiSampleQuality;
    UINT Width;
    UINT Height;
} D3DSURFACE_DESC, *LPD3DSURFACE_DESC;

这个结构体用来存储一个surface的尺寸(dimension)、以及dimension在内存中是怎么存储的。

结构体使用Height和Width成员来描述surface的逻辑大小(height和width以像素为单位measured int pixels)。

所以,一个640x480的surface的height和width是一样的,无论它是一个8-bit的surface还是24-bit RGB surface。

当我们使用IDirect3DSurface9::LockRect方法来lock一个surface时,需要填充一个D3DLOCKED_RECT结构体。

HRESULT LockRect(
  D3DLOCKED_RECT * pLockedRect,
  CONST RECT * pRect,
  DWORD Flags
);
typedef struct D3DLOCKED_RECT {
    INT Pitch;
    void * pBits;
} D3DLOCKED_RECT, *LPD3DLOCKED_RECT;

D3DLOCKED_RECT成员描述了surface的memory pitch,也叫stride(策略,估量尺寸)

Pitch is the distance, in bytes, between two memory addresses that represent the beginning of one

bitmap line and the beginning of the next bitmap line。(一行图形所占的字节)

pitch用字节(byte)衡量而不是像素。

所以不同format的surface的pitch也明显不同。

另外,pitch值有时反映出被Direct3D保留并用作高速缓存的字节数,因此简单地认为pitch就是宽度乘以每个像素所占的字节数是不安全的

总结:width就是图像实际显示的宽度。而pitch是存储的一行图像所占的字节(相邻两行起点指针的差值)

           width和pitch的单位不同:width是像素,pitch是字节byte.因此一个640*480*8的位图和640*480*24的位图的width相同但pitch不同。

           pitch可能大于width个像素所占字节。有时为了高效处理,会将每个图形都对齐存储,这样pitch就包括了对齐使用的填充字节。

posted on 2011-11-16 22:00  noobstudy3d  阅读(1274)  评论(0编辑  收藏  举报

导航