DirectX5.0最新遊戲程式設計指南 DirectDraw篇 三、DirectDraw的要素(二) (轉)

worldblog發表於2007-12-04
DirectX5.0最新遊戲程式設計指南 DirectDraw篇 三、DirectDraw的要素(二) (轉)[@more@]

4、表面(Surface)
  一個表面或DirectDrawSurface表徵了一塊線性區域。表面通常都駐留在顯示記憶體中,當然也可以存在於記憶體中。除非明確指定,在建立DirectDrawSurface物件時,DirectDraw會把DirectDrawSurface物件放置於能夠獲得最佳的位置。DirectDrawSurface物件還能利用顯示卡上的特殊,不僅可以加快任務的速度,還可以同系統並行處理一些任務。
  使用IDirectDraw2::CreateSurface方法,你可以建立單一的表面物件,複雜的表面翻轉鏈和三維的表面。使用CreateSurface方法建立要求的表面或翻轉鏈並且獲得主表面的IDirectDrawSurface介面的指標。
  IDirectDrawSurface3介面使你能夠用位塊傳輸方法直接訪問記憶體,如 IDirectDrawSurface3::BltFast方法等。表面物件能提高一個裝置上下文,它可以讓你使用GDI。另外,你可以使用IDirectDrawSurface3方法之間訪問顯示記憶體。例如,你可以使用IDirectDrawSurface3::Lock方法鎖定顯示記憶體並獲取相關表面的地址。顯示記憶體的地址可能指向可見緩衝區記憶體(主表面)或不可見緩衝區(屏外表面或覆蓋表面)。
不可見緩衝區通常駐留在顯示記憶體中,但可在系統記憶體這建立,如果允許或DirectDraw使用了模擬功能的話。另外,IDirectDrawSurface3介面擴充套件了一些方法。利用這些方法,能夠放置或獲取調色盤工作於指定型別表面。
4.1、表面介面(Surface Interface)
  DirectDrawSurface物件透過IDirectDrawSurface、 IDirectDrawSurface2,和IDirectDrawSurface3介面來表現其功能。每一個新版本的介面都提高了同以前版本同樣的功能,並且透過新的方法提供了舊版本中不曾具有的功能。
IDirectDrawSurface介面上該類介面中最老的版本,當你使用IDirectDraw2::CreateSurface方法建立一個表面時,預設提供的就是這一介面。
要利用另一版本的介面提供的新的功能,你還必須用QueryInterface方法查詢新版本的介面。下面的程式碼顯示瞭如何完成這一工作的:
LPDIRECTDRAWSURFACE  lpSurf;
LPDIRECTDRAWSURFACE2 lpSurf2;
  // Create surfaces.
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
   DDSCAPS_SYSTEMMEMORY;
ddsd.dwWidth = 10;
ddsd.dwHeight = 10;
 
ddrval = lpDD2->CreateSurface(&ddsd, &lpSurf,  NULL);
if(ddrval != DD_OK)
   return;
 
ddrval = lpSurf->QueryInterface(
   IID_IDirectDrawSurface2, (LPVOID *)&lpSurf2);
if(ddrval != DD_OK)
   return;
 
ddrval = lpSurf2->PageLock(0);
if(ddrval != DD_OK)
   return;
 
ddrval = lpSurf2->PageUnlock(0);
if(ddrval != DD_OK)
   return;
 
  上面的例子在QueryInterface方法時透過指定IID_IDirectDraw2標誌獲得了DirectDrawSurface物件的IDirectDrawSurface2介面。要想得到 IDirectDrawSurface3介面,用IID_IDirectDrawSurface3標誌代替IID_IDirectDraw2即可。
4.2、Color Key
  DirectDraw支援位塊傳輸和覆蓋表面方式下的源Color Key和目的Color Key。透過呼叫IDirectDrawSurface3::SetColorKey方法來設定表面的Color Key。當使用位塊傳輸時,源Color Key指明瞭不被複製的顏色或顏色範圍,目的Color Key指明瞭被替換的顏色或顏色範圍。
  一些硬體只支援YUV畫素格式的顏色範圍。YUV資料通常是影片資料,透明背景由於轉換中的量化誤差可能不是一種單一的顏色。
  Color Key用表面的畫素格式來指定。如果表面是調色格式的,Color Key就被指定為或索引的範圍。如果表面的畫素格式由描述YUV格式的FOURCC程式碼指定,YUV的Color Key就由三個DDCOLORKEY結構中的兩個成員dwColorSpaceLowValue和dwColorSpaceHighValue三個位元組指定,三個位元組分別是V、U、Y資料。IDirectDrawSurface3::SetColorKey方法中的dwFlags引數指明瞭Color Key是否用於覆蓋或
位塊傳輸操作,是否是一個源Color Key或目的Color Key。下面的程式碼是有效的Color Key的一些例項:
// 8位調色
// 調色盤實體26是 color key.
dwColorSpaceLowValue = 26;
dwColorSpaceHighValue = 26;
 
// 24位真彩模式
// 顏色255、128、128是color key.
dwColorSpaceLowValue = RGBQUAD(255,128,128);
dwColorSpaceHighValue = RGBQUAD(255,128,128);
 
// FourCC YUV模式
// Any YUV color where Y is between 100 and 110
// and U or V is between 50 and 55 is transparent.
dwColorSpaceLowValue = YUVQUAD(100,50,50);
dwColorSpaceHighValue = YUVQUAD(110,55,55);

4.3、畫素格式(Pixel Format)
  畫素格式指出了任何對錶面記憶體中每個畫素資料作出解釋。DirectDraw使用DDPIXELFORMAT結構描述各種畫素資訊。
DDPIXELFORMAT結構的成員描述了畫素格式的下述特性:
 .調色或非調色畫素格式
 .如果是非調色格式,畫素格式是RGB還是YUV格式
 .位深度
 .畫素格式組成部分的位遮蔽
你可以呼叫IDirectDrawSurface3::GetPixelFormat方法來獲取存在的表面的畫素格式。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987879/,如需轉載,請註明出處,否則將追究法律責任。

相關文章