注:原文地址:http://scorpioncity.com/dj2.html
1、圖像模式
按照用多少位來存儲(chǔ)屏幕上的一個(gè)像素,有好多種屏幕模式。使用更多的位,就能顯示更多的顏色,但會(huì)占用更多的顯存。
- 1、2、4、8位 “indexed”模式(8位就是通常所說的"256色");
- 16位(64K色)“high-color” 模式;
- 24位(16.7M色)“真彩色”模式;
- 32位 RGBA 模式,前三個(gè)字節(jié)和24位真彩色模式一樣,第4個(gè)字節(jié)用做“alpha-channel”,即透明度。
這些模式都是可用的。下面說一下分辨率:
- 320x200
- 320x240
- 640x400
- 640x480
- 800x600
- 1024x768
- 1280x1024
- 1600x1200
現(xiàn)在比較常用的是640x480
(好像年代比較久遠(yuǎn)了這篇文章,我覺得1024x768應(yīng)該比較常用吧)。
顯示器通常是3/4的縱橫比,所以沿著高的那個(gè)邊擁有的像素點(diǎn)應(yīng)該是寬的那個(gè)的3/4,這樣像素點(diǎn)的長(zhǎng)寬比就是1,所以像素點(diǎn)就是正方形,也就是說100個(gè)像素在一個(gè)方向上的物理長(zhǎng)度和另一個(gè)方向上的相當(dāng)。但是320x200不是這樣子滴,實(shí)際上它的像素點(diǎn)是稍顯瘦高一點(diǎn)的。
2、顏色原理
有好多種表示顏色的方法,即“顏色模型”,比較常見的一個(gè)是“RGB”,幾乎所有可見的顏色都可以用紅、綠、藍(lán)三種顏色按照各種比例組合生成。通常會(huì)用三個(gè)字節(jié)來存儲(chǔ)顏色,每位表示一個(gè)主色的強(qiáng)度,從0到255。比如純的亮紅色就是#ff0000,紫色是#ff00ff,灰色是#969696,等等。
下面是一些可以用來表示顏色的c代碼:
struct SColor


{
int r;
int g;
int b;
};

SColor make_rgb( int r, int g, int b )


{
SColor ret;
ret.r = r;
ret.g = g;
ret.b = b;
return ret;
}

或者你可能用一個(gè)無符號(hào)32位整型來儲(chǔ)存RGB顏色,0-7位存藍(lán)色,8-15位綠色等等。
typedef unsigned int rgb_color;

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

當(dāng)然還有其他的顏色模型,比如HSV(Hue 色調(diào), Saturation 飽和度, Luminance 亮度),但我不打算涉及它。
2.1 High-color和true-color模式
在這兩種模式下,屏幕像素按照他們相應(yīng)的RGB值存儲(chǔ)到顯存里。比如,如果屏幕左上角的像素點(diǎn)是綠色,那么在true-color模式下,顯存里前三個(gè)字節(jié)就是0,255,0。而在high-color模式下,對(duì)應(yīng)的RGB值分別用5、6、5位來存儲(chǔ),即前5位紅色,接下來6位綠色,然后5位藍(lán)色,所以在這個(gè)模式下顯存對(duì)應(yīng)的就是兩個(gè)字節(jié),二進(jìn)制表示就是 00000111 11100000。
2.2 基于調(diào)色板或者indexed模式
Indexed模式使用一個(gè)“look up table”(LUT)的原理,即顏色查看表,通常這種模式使用8位圖像模式,即256色,屏幕上的每個(gè)像素都用一個(gè)字節(jié)來表示,所以每次只能顯示256 種顏色,所以這256種顏色就按照每種3個(gè)字節(jié)存到LUT里,顯卡每次就按照LUT里的值確定要顯示的顏色。
用Indexed模式創(chuàng)建一個(gè)程序是非常痛苦的,尤其是搞圖像藝術(shù)的,但使用Indexed模式還是有一些優(yōu)勢(shì)的:
* 需要很少的內(nèi)存
* 運(yùn)行會(huì)更快,因?yàn)樾枰獋鬏數(shù)淖止?jié)變少了
* 一些有趣的“調(diào)色板動(dòng)畫”技巧,在其他模式下很難完成的在Indexed模式下簡(jiǎn)直太容易了。你可以只改變LUT里的值去改變屏幕顏色,而不需要改變內(nèi)存里每個(gè)像素對(duì)應(yīng)的值。例如,一個(gè)淡出效果可以改變LUT里的RGB值到0來實(shí)現(xiàn)。
* 當(dāng)你有一個(gè)紋理需要很多內(nèi)存的時(shí)候,有些3D加速器支持Indexed模式的紋理。
2.3 ModeX
ModeX是一個(gè)特殊的 VGA 256色模式,這種模式下顯存的內(nèi)容會(huì)按照一個(gè)稍微復(fù)雜點(diǎn)planar(二維)格式。這個(gè)模式下的分辨率可以非常高,DirectDraw知道如何寫 ModeX表面,但是windows GDI并不會(huì),所以當(dāng)你混合這兩種不同類型表面的時(shí)候要小心。當(dāng)設(shè)置DirectDraw全屏模式時(shí)可以選擇是否允許DirectDraw創(chuàng)建ModeX 表面。這些日子里你可能想避開ModeX。
2.4 Pitch/Stride
雖然屏幕分辨率可能是640x480x32,但這并不是說每行像素會(huì)占用640x4個(gè)字節(jié)的顯存。因?yàn)樗俣壬系脑颍@卡存儲(chǔ)的這些表面寬度經(jīng)常比他們邏輯上要寬。例如,最大支持1024x768的顯卡可能會(huì)把所有從320x200到1024x768的模式內(nèi)部實(shí)現(xiàn)為1024x768模式,所以表面的右邊會(huì)留下空白
(呵呵,默認(rèn)左對(duì)齊),這個(gè)分配給表面實(shí)際的寬度就稱為表面的Pitch(或者Stride),知道表面的Pitch是非常重要的,不管它是一個(gè)2D DirectDraw 表面還是紋理貼圖,可以使用 DirectDraw 查詢表面的Pitch。
3、一些游戲概念你需要知道
下班了,以后繼續(xù)。。。