亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 第9小節.txt

?? 游戲編程起源...中文版
?? TXT
字號:
   
  
 傻馬亂踢  譯   
 
 
  
游戲編程起源(初學者)Ⅸ
 
 
 
★ 第五章 DirectDraw的調色板和象素

☆ 簡介

今天我們將分別使用調色板和RGB模式來熟悉DirectDraw的基本圖形。它們有什么不同呢?如果你曾經在DOS下編程,你可能使用過調色板映射模式。調色板是個顏色查詢表,為了繪制象素,你將一個單獨的字節寫入視頻內存,通過這個字節你可以索引到一個擁有各種顏色的鏈表,這個顏色的鏈表,或查詢表就叫作調色板。而RGB模式是不同的,因為它不需要顏色查詢表。在RGB模式下繪制一個象素,你可以直接把紅色、綠色和藍色的值寫入視頻內存。任何色彩深度高于8位的調色板都可以用RGB模式取代。
編寫本章時,我假設你已經讀過了前面幾章,知道了怎樣設置DirectDraw和創建表面。我們將使用DirectX7,它包含了最新的DirectDraw接口。實際上,DirectX 7 中的DirectDraw接口可能是最后的升級版本了!不用擔心,未來的版本一定會兼容它的,但是未來可能是一個DirectDraw和Direct3D綜合的產品,管它那,我們學的不會沒有用的。^_^
在開始前我還有最后一件事要提醒你:在我的后續文章中關于調色板的部分可能再也用不到了,所以,如果你對于調色板模式不是很感興趣,你可以跳過文章的前一部分,從象素格式開始看起。調色板的開發和使用是PC中使用的原始視頻系統的內存限制帶來的直接后果。現在由于充足的顯存使調色板模式幾乎廢棄不用了。值得保留調色板模式的一個原因是,執行調色板操作可以實現一些有趣的動畫效果。不羅嗦了,讓我們開始吧!

☆ 創建DirectDraw的調色板

當你在色彩深度為8位或低于8位的模式下顯示圖形時,你必須創建調色板,也就是顏色查詢表。更明確的講,對于DirectX,調色板就是PALETTEENTRY結構。要建立一個調色板,我們要做如下三步:
1、 創建顏色查詢鏈表。
2、 得到指向IDirectDrawPalette接口的指針。
3、 把調色板鏈接到DirectDraw表面。

我假設我們使用的是8位色彩深度。如果你要用16位或更高位的色彩深度編寫游戲,你就不用繼續看以下這段瘋狂的Windows素材了。總之,8位色彩深度,我們可以有一個256個條目的調色板。所以,創建顏色查詢鏈表,有256個條目在其中:

typedef struct tagPALETTEENTRY { // pe
    BYTE peRed;
    BYTE peGreen;
    BYTE peBlue;
    BYTE peFlags;
} PALETTEENTRY;

頭三個參數很明顯,分別是紅色、綠色和藍色的強度。每一個取值范圍0-255,BYTE是無符號數據類型。最后一個參數是控制標志,應該設置為PC_NOCOLLAPSE。原因我就不說了。
現在,我們需要把256個條目有秩序的排列好,也就是為了一下能找到,我們為鏈表設置一個數組,象這樣:
PALETTEENTRY palette[256];
Ok,我們有了數組了,你可以裝載顏色了。當我工作在調色板模式下時,通常把顏色存儲在一個外部文件里,然后用一些如下的東東裝載顏色:

FILE* file_ptr;
int x;

if ((file_ptr = fopen("palette.dat", "rb")) != NULL)
{
    fread(palette, sizeof(PALETTEENTRY), 256, file_ptr);
    fclose(file_ptr);
}

All right,第一步完成了。現在我們需要得到調色板的接口。交給IDirectDraw7::CreatePalette()函數就好了:

HRESULT CreatePalette(
    DWORD dwFlags,
    LPPALETTEENTRY lpColorTable,
    LPDIRECTDRAWPALETTE FAR *lplpDDPalette,
    IUnknown FAR *pUnkOuter
);

返回類型是HRESULT,你知道它的,所以可以用FAILED()和SUCCEEDED()這兩個宏檢測函數是否調用成功。參數的說明如下:
※ DWORD dwFlags:描述調色板對象的標志常量。當然,你可以用“|”組合它們:
◎ DDPCAPS_1BIT:1位色彩,對應2色調色板。
◎ DDPCAPS_2BIT:2位色彩,對應4色調色板。
◎ DDPCAPS_4BIT:4位色彩,對應16色調色板。
◎ DDPCAPS_8BIT:8為色彩,對應256色調色板。
◎ DDPCAPS_8BITENTRIES:指出引用一個8位色彩索引。就是說,每個顏色條目是它本身的到目的表面8位調色板的索引。這叫作被變址的調色板。它必須同DDPCAPS_1BIT、DDPCAPS_2BIT,或者DDPCAPS_4BIT合用。亂套吧!^_^
◎ DDPCAPS_ALPHA:每一個PALETTEENTRY的peFlags成員都應該被認為是阿爾發值。用這些標志創建的調色板可以被粘貼在Dierct3D紋理表面,因為DirectDraw本身并不支持阿爾發混合。
◎ DDPCAPS_ALLOW256:允許8位調色板的全部256個條目被使用。通常,0指向黑色,255指向白色。
◎ DDPCAPS_INITIALIZE:指出應該用PALETTEENTRY的數組初始化調色板。
◎ DDPCAPS_PRIMARYSURFACE:調色板將鏈接到主表面,好快速更改顯示顏色。
◎ DDPCAPS_VSYNC:一般畫圓時用到它。
大多數情況,你將使用DDPCAPS_8BIT | DDPCAPS_INITIALIZE,如果你剛好想建立一個空的調色板,稍后再設置它,你可以去掉后者,就是DDPCAPS_INITIALIZE。當然,你還可以使用DDPCAPS_ALLOW256,如果你真的想改變這兩個常用的條目。
※ LPPALETTEENTRY lpColorTable:這個指針指向我們創建的查詢表,把數組的名稱傳遞給它就好了。
※ LPDIRECTDRAWPALETTE FAR *lplpDDPalette:這是指向IDirectDrawPalette接口指針的地址。如果函數調用成功,它將被初始化。
※ IUnkown FAR *pUnkOuter:同以前一樣,這總是為COM高級應用準備的。設置為NULL好了。

不是太糟糕吧!現在我們可以建立我們的調色板對象了。最后一步是把調色板鏈接到一個表面,這只需要一個函數就好了——IDirectDrawSurface7::Setpalette()。它的原形如下:

HRESULT SetPalette(LPDIRECTDRAWPALETTE lpDDPalette);

很簡單,是不是?你只要把上一步得到的接口指針傳遞給它就可以了。那好,讓我們把學到的綜合到一起,下面我給你一個程序框架,我假設我們已經利用調色板的數組建立了一個索引鏈表,就像我們上一步做的。該框架是建立DirectDraw調色板來控制顏色,并且把它鏈接到主表面(當然,主表面是我們事先做好的):

LPDIRECTDRAWPALETTE lpddpal;

// create the palette object
if (FAILED(lpdd7->CreatePalette(DDPCAPS_8BIT | DDPCAPS_INITIALIZE, palette, &lpddpal, NULL)))
{
    // error-handling code here
}

// attach to primary surface
if (FAILED(lpddsPrimary->SetPalette(lpddpal)))
{
    // error-handling code here
}

就是這么簡單。一旦你的調色板建立完成,繪制象素部分同RGB模式就沒有什么不同了。從此時開始,我將同時介紹RGB模式和調色板模式,在我們真正的顯示圖象前,我需要告訴你什么是RGB象素格式。

☆ 象素格式

象我前面說過的,當你把一個調色板模式的象素寫入內存時,你同時分配了一個字節,每個字節表示一個到色彩查詢表的索引。在RGB模式下,你只需要把顏色描述值寫入內存,但每個顏色需要的字節數都要多于一個字節。字節的多少同色彩的深度相關。對于16-bit色彩,你要為每個象素準備兩個字節(16位),以此類推,你可以猜到32-bit色彩是怎么回事了,這些都是很容易理解的。32-bit色彩對于一個象素來說,每一位的字符如下:

AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB

“A”是代表“alpha”(阿爾發),表示一個透明的值,這是為Direct3D準備的。我以前說過,DirectDraw不支持α混合,所以當你為DirectDraw創建32-bit色彩時,把高位都設置為0好了。下一個8位表示紅色強度的值,再下一個8位表示綠色,最后8位表示藍色。
一個32-bit色彩的象素需要32位,所以我們一般用UINT類型來定義相對應的變量類型,這是一個無符號實數類型。通常我用一個宏來把RGB數據轉換成正確的象素格式。讓我給你看看它的樣子,希望這能更好的幫助你理解象素格式:

#define RGB_32BIT(r, g, b) ((r << 16) | (g << 8) | (b))

就象你看到的,這個宏通過位移在相應的位置寫入了相應的紅、綠、藍的強度值,并且完全符合正確的象素格式。是不是開始感覺有點兒入門了?要建立一個32-bit的象素,你就可以調用這個宏。紅、綠、藍每一個顏色的強度值都是8位,它們的取值范圍都是從0——255。例如建立一個白色的象素,你可以這樣:

UINT white_pixel = RGB_32BIT(255, 255, 255);

24-bit色彩基本相同,道理實際上是一樣的,只是24-bit沒有關于α的描述,也就是少了α那8位。象素格式如下:

RRRR RRRR GGGG GGGG BBBB BBBB

所以紅色、綠色、藍色仍然都分別是8位,這就意味著24-bit色彩和32-bit色彩實際上是有相同顏色深度的,只是32-bit多了個α混合。現在,你一定會想,24-bit比32-bit要好,真的是這樣嗎?否,因為使用24-bit有一些麻煩,事實上沒有24-bit的數據類型,在你建立象素時,你不得不分三步寫入紅、綠、藍的強度值,而不是象32-bit一次就完成。盡管32-bit色彩需要更多的內存,但在大多數的機器上,它要更快一些。實際上,很多顯示卡不支持24-bit色彩模式,因為每一個象素占用3個字節是很不方便的。
現在,輪到16-bit色彩了,它有一點兒小麻煩,因為對于16-bit色彩,不是每一種顯示卡都使用相同的象素格式!有兩種格式。其中一種,也是比較流行的,紅色占據5位,綠色占據6位,藍色占據剩下的5位。另一種格式是分別都占據5位,剩下的一位,也就是高位不使用,一些老的顯示卡都使用這種格式。所以這兩種格式看起來是這樣的:

565 format: RRRR RGGG GGGB BBBB
555 format: 0RRR RRGG GGGB BBBB

當你工作在16-bit色彩深度下,你首先需要檢測顯示卡是支持565格式還是555格式,然后使用適當的方式。這是很討厭的,但你堅持用16-bit色彩,這是沒有辦法避免的。由于存在兩種格式,你就需要兩種宏:

#define RGB_16BIT565(r, g, b) ((r << 11) | (g << 5) | (b))
#define RGB_16BIT555(r, g, b) ((r << 10) | (g << 5) | (b))

對于565格式,紅色和藍色的取值范圍是0——31,綠色是0——63;對于555格式,取值范圍都是0——31,所以當要創建一個白色象素時,就會有所不同:

USHORT white_pixel_565 = RGB_16BIT565(31, 63, 31);
USHORT white_pixel_555 = RGB_15BIT555(31, 31, 31);

這個USHORT是無符號短實數類型,對應的變量只有16位。存在兩種格式把事情搞得有些復雜,但在實際的游戲編程過程中,你將會感覺到這并沒有你想象的那么討厭。順便說一下,有些時候555格式被稱為15-bit色彩深度,所以在以后如果我這樣談到了它,你一定要心領神會哦!^_^
現在或許是告訴你在16-bit色彩深度模式下,怎樣檢測顯示卡到底支持哪種格式的時機了,是555還是565呢?最簡單的辦法就是調用IDirectDrawSurface7接口下的GetPixelFormat()函數,它的原形如下:

HRESULT GetPixelFormat(LPDDPIXELFORMAT lpDDPixelFormat);

參數是指向DDPIXELFORMAT結構的指針。你只要聲明它,初始化它,然后傳遞它的地址就一切OK了。這個結構的本身是巨大的,所以我就不列舉它了,但我得告訴你它的三個成員,都是DWORD類型的,它們是dwRBitMask、dwGBitMask、和dwBBitMask。你可以從dwRBitMask、dwGBitMask和dwBBitMask中獲得掩碼值(新東東,先不用太明白)。你也可以用它們檢測顯示卡支持的格式。如果顯示卡支持565,dwGBitMask將為0x07E0。如果是555格式,dwGbitMask為0x03E0。
現在,我們已經學習了所有我們可能用到的象素格式,可以進入在DirectX下顯示圖象的實際階段了。你已經等待了很久了,不是嗎?在把象素放到表面上前,我們需要鎖定表面,至少是鎖定表面的一部分。鎖定表面返回一個指向表面在內存里位置的指針,然后,我們就可以為所欲為了。

☆ 鎖定表面

待續。。。。。。
  
 
  
  
 
 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91久久免费观看| 日本韩国精品一区二区在线观看| 亚洲欧美国产高清| 国产精品国产三级国产aⅴ中文 | 91黄色免费版| 不卡的av电影| 日本精品一级二级| 欧美人妖巨大在线| 日韩免费一区二区| 欧美国产97人人爽人人喊| 国产精品麻豆视频| 亚洲成人激情综合网| 日本不卡一区二区| 韩国精品久久久| 懂色av噜噜一区二区三区av| 99国产精品久久久久| 欧美日韩中文字幕一区二区| 欧美日韩精品一区二区在线播放| 欧美日韩国产精选| 精品国产亚洲一区二区三区在线观看| 精品久久久久久亚洲综合网| 日本一区二区三区久久久久久久久不 | 久久久久久久精| 中文字幕不卡的av| 亚洲一区二区三区视频在线播放| 亚洲一区在线观看免费 | 国产成人日日夜夜| 色婷婷久久久久swag精品| 337p亚洲精品色噜噜狠狠| 日韩欧美一二区| 亚洲欧美日韩在线| 精品一区二区三区在线观看 | 亚洲成av人片| 国产一区视频在线看| 色伊人久久综合中文字幕| 精品理论电影在线| 亚洲黄色小说网站| 国产中文字幕精品| 欧美日韩亚洲综合在线| 国产精品日韩精品欧美在线| 日韩av电影免费观看高清完整版| 国产精品夜夜嗨| 欧美一级日韩不卡播放免费| 国产精品免费看片| 久久 天天综合| 69久久99精品久久久久婷婷| 日韩理论片网站| 激情综合五月天| 欧美日韩国产免费一区二区| 中文字幕亚洲精品在线观看| 国内精品伊人久久久久av影院| 色老头久久综合| 国产精品久久99| 国产成人午夜精品影院观看视频 | 国产91丝袜在线观看| 欧美一区二区三区人| 亚洲精品一二三区| 成人av在线资源网| 国产亚洲视频系列| 国产在线播精品第三| 精品久久久久久久久久久院品网| 亚洲成年人影院| 欧美日韩亚洲另类| 偷拍一区二区三区| 欧美色老头old∨ideo| 中文字幕五月欧美| 99re66热这里只有精品3直播 | 91免费国产在线观看| 久久久久国产成人精品亚洲午夜| 日韩不卡一二三区| 3d成人动漫网站| 日本亚洲最大的色成网站www| 欧美亚洲国产一卡| 日韩精品色哟哟| 91精品国产全国免费观看 | 2017欧美狠狠色| 美女看a上一区| 精品免费一区二区三区| 热久久免费视频| 欧美va亚洲va香蕉在线| 久国产精品韩国三级视频| 欧美videos大乳护士334| 国产综合久久久久久鬼色| 久久色在线观看| 成人黄页在线观看| 亚洲精品一卡二卡| 这里是久久伊人| 国产精品综合一区二区三区| 欧美激情一二三区| 欧美亚洲国产bt| 免费在线观看视频一区| 久久免费的精品国产v∧| 成人久久18免费网站麻豆| 亚洲日本在线观看| 91精品国产91久久久久久最新毛片| 视频精品一区二区| 久久色.com| 欧美视频一区在线观看| 美腿丝袜亚洲色图| 成人欧美一区二区三区1314| 91国产免费观看| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品人妖ts系列视频| 欧美日韩一区二区三区在线看| 日韩成人午夜精品| 综合色中文字幕| 欧美福利视频导航| 国产成人自拍网| 一区二区在线观看视频| 欧美一区二区精品久久911| 成人教育av在线| 免费在线观看精品| 一区二区三区四区在线播放 | 韩国女主播一区二区三区| 国产精品短视频| 日韩欧美一区二区视频| 99re成人精品视频| 国产成人小视频| 免费成人av在线播放| 亚洲日本电影在线| 久久日韩精品一区二区五区| 欧美午夜在线观看| 成年人网站91| 国产毛片精品一区| 免费xxxx性欧美18vr| 一区二区高清视频在线观看| 久久九九久久九九| 精品国产免费久久| 欧美丰满一区二区免费视频| 91尤物视频在线观看| 国产美女视频91| 久久电影网站中文字幕| 午夜精品免费在线| 亚洲综合网站在线观看| 国产精品欧美经典| 久久婷婷国产综合国色天香| 7777精品伊人久久久大香线蕉超级流畅| 成人av综合一区| 国产成人鲁色资源国产91色综 | 日日夜夜免费精品视频| 亚洲精品自拍动漫在线| 亚洲日本在线a| 亚洲色图20p| 亚洲精品一二三| 樱桃国产成人精品视频| 一区二区成人在线观看| 亚洲综合视频在线| 亚洲一区二区三区不卡国产欧美| 中文字幕永久在线不卡| 国产精品美女视频| 亚洲婷婷在线视频| 亚洲精品va在线观看| 亚洲色图欧洲色图| 亚洲影视在线观看| 奇米色777欧美一区二区| 免费人成在线不卡| 国产一区二区三区四区五区美女| 精品亚洲porn| 国产成人av一区二区三区在线| 国产一区二区三区视频在线播放| 国产主播一区二区| 成人国产精品免费观看| 91在线小视频| 欧美日韩国产影片| 欧美成人r级一区二区三区| 久久亚洲免费视频| 国产精品久久久久精k8| 亚洲一区二区欧美日韩 | 波多野结衣亚洲| 91蜜桃婷婷狠狠久久综合9色| 色综合视频在线观看| 欧美在线观看视频一区二区| 日韩一二在线观看| 中文字幕精品—区二区四季| 亚洲免费伊人电影| 日本aⅴ免费视频一区二区三区| 韩国精品久久久| 色天天综合久久久久综合片| 日韩一卡二卡三卡国产欧美| 久久久美女毛片| 亚洲欧美色图小说| 免费高清成人在线| 成人中文字幕合集| 51精品视频一区二区三区| 亚洲国产精品av| 亚洲高清视频在线| 粉嫩蜜臀av国产精品网站| 欧美军同video69gay| 国产精品久久久久aaaa樱花| 亚洲bt欧美bt精品| 成人a级免费电影| 欧美成人精品1314www| 一区二区三区在线免费视频| 精品中文字幕一区二区| 在线欧美日韩国产| 欧美国产综合一区二区| 美国精品在线观看| 欧美优质美女网站| 中文字幕欧美三区| 精品综合免费视频观看|