【发布时间】:2019-03-22 14:43:44
【问题描述】:
好的。
我正在使用用于 DirectX 的 FW1FontWrapper 代码
:https://archive.codeplex.com/?p=fw1
这让我不再需要使用由纹理驱动的过时且无用的字体引擎。
但是,此 Wrapper 中的 DrawString 函数对颜色表示有特殊要求。
UINT32 Color : In the format 0xAaBbGgRr
我为此任务提供的数据是一个恒定的 Alpha 值:1.0f。
R、G 和 B 的 3 个可变浮点值,范围从 0.0f 到 1.0f。
鉴于 UNIT32 中颜色的特殊排列,我正在尝试编写一个函数,该函数将使用给定的 3 个浮点值创建这个 UNIT32。
我的尝试
UINT32 TextClassA::getColour(SentenceType* sentence)
{
//Convert each float value to its percentage of 255
int colorb = 255 * sentence->blue;
int colorg = 255 * sentence->green;
int colorr = 255 * sentence->red;
//convert each int to 8 bit Hex
UINT8 ucolorb = colorb;
UINT8 ucolorg = colorg;
UINT8 ucolorr = colorr;
//Push each hex back onto a UNIT32
UINT32 color = 0xFF + (ucolorb << 6) + (ucolorg << 4) + (ucolorr << 2);
return color;
}
句子类型
对于 0.0-1.0f 的每个 RGB 值,红色、绿色和蓝色只是浮点数
我的想法。
我大概可以:
将每个浮点值转换为其 255 的百分比(不要太担心完美的准确性。
将这些整数值转换为 UINT8s
然后将它们推回 UINT32
【问题讨论】:
-
这个问题似乎错过了一个实际问题。为什么它不起作用:
<<6是 6 位移位,当您需要 16 位移位时;<<4应该是<<8和<<2根本不应该移动。如果您仍在为十六进制数字 (4) 中的位数或从哪里开始计数 (0) 苦苦挣扎,您似乎有点过头了。 -
啊,是的!当我让它工作但颜色值关闭时,我也在我的解决方案中意识到了这一点!这是我第一次真正搞砸位移,所以我的逻辑基于我的逻辑