分享
 
 
 

16位模式下“555”的问题

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

当我开始使用DirectX,我决定不再使用旧的256色模式,而是直接开始改用16位模式。有千万种的颜色可使用

是多么的令人愉快。

我买了一本很好的书去学习怎么使用C++和DirectX。我做的第一件事是写一个在屏幕上显示一些点的程序。当

它在另一台计算机运行时,我发现屏幕上所有的颜色都错了!所有的颜色都偏绿了。到底是哪里出错了?一个朋友

告诉我有些图形卡使用了不同的16位模式。

书的作者也提及了这个问题。在他的例子中, 他使用了#define定义RGB值为WORD。这个#define假定图形模式

为555 。这意味着在WORD中的每各通道都用5位剩余的1位不使用。其它的卡使用565模式。(我不知道是否还有其它

的模式,但我写的例程还未发现过问题。)

在高彩模式下,我们用一个WORD来表示一个像素。但由于显卡的差异, 通常会有555和565两种情况。

555是指颜色表示的RGB分量各占5位,如图:

N

R

R

R

R

R

G

G

G

G

G

B

B

B

B

B

565是指颜色表示的RB分量各占5位,G分量占6位,如图:

R

R

R

R

R

G

G

G

G

G

G

B

B

B

B

B

书中的#define看起来就象:

#define _RGB16BIT (r, g, b) ( (b % 32) + ( (g % 32) << 5)+( (r % 32) << 10))

如果忘了它,而使用恒值555将不能保证在所有的计算机上正常工作。幸运的是,有一个DX函数可以返回DWORD

s 简要地说明了颜色模式(以及一些其它资料)。

这个函数的语法格式是:HRESULT GetpixelFormat(DDPIXELFORMAT x)

如果你想知道绿色用了几位, 你可以查看DWORD中绿色通道设置为几位。因此我写了下面的函数。

使用这个函数必须定义四个全局变量:

DWORD redbits, greenbits, bluebits, rgbbits;

bool MyGetPixelFormat()

{

// init the vars:

redbits = greenbits = bluebits = rgbbits = 0;

// the PixelFormat structure:

DDPIXELFORMAT DDPixelFormat;

DDPixelFormat.dwSize = sizeof(DDPIXELFORMAT); // don't forget this!

// fill the pixel-format structure:

if (lpddsprimary->GetPixelFormat(&DDPixelFormat)!=DD_OK) return false; // * error * //

// fill the global vars with values from the struct:

redbits = DDPixelFormat.dwRBitMask;

greenbits = DDPixelFormat.dwGBitMask;

bluebits = DDPixelFormat.dwBBitMask;

rgbbits = DDPixelFormat.dwRGBBitCount;

// now let us see, how much bits each color-channel has got (5 or 6):

int bit = 0;

bool done = false;

DWORD count = 1; // look for # of blue bits:

while (!done)

{

if (bluebits & count)

{

bit++;

count <<= 1;

}

else done = true;

}

bluebits = bit;

bit = 0;

done = false;

// look for # of green bits:

while (!done)

{

if (greenbits & count)

{

bit++; count <<= 1;

}

else

done = true;

}

greenbits = bit;

bit = 0;

done = false;

// look for # of red bits:

while (!done)

{

if (redbits & count)

{

bit++;

count <<= 1;

}

else

done = true;

}

redbits = bit;

/* Now the vars red-, green- and bluebits are filled simply with the number of the channel!

Perfect.*/

return true;

}

现在我们知道了图形模式(555, 565...)。接着我们需要用前面提到的 #define 做一个函数来工作。我写的这

个函数要用到参数int r, g, b返回一个USHORT。颜色值的范围为0..255。

USHORT _RGB16BIT (int r , int g, int b)

{

// the return value

USHORT retval = 0;

// max value has to be either 32 or 64,

// depending on the number of bits of the channel:

if (redbits == 6) r >>= 2; else r >>= 3;

if (greenbits == 6) g >>= 2; else g >>= 3;

if (bluebits == 6) b >>= 2; else b >>= 3;

// as I said, I don't know how many modes there are. If you do, shorten

// the function by removing unnessessary lines above.

// And please tell me! ;-)

// now build a word of the three channels by shifting them by the

// _correct_ number of bits:

retval = (USHORT) (b + (g << bluebits) + (r << (bluebits + greenbits)));

// return the color: return(retval);

}

好了,朋友,就这样!你可以在初始化DDraw之后调用MyGetPixelFormat()函数。然后,你就可以用RGB16BIT

(r, g, b)画点或从文件中读入RGB数据等等。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有