如何通过组合红色和蓝色无符号字节来优化混合?
How to optimize blend by combining red and blue unsigned byte?
我有这个 RGB 混合功能。我想做的是将红色和蓝色放在一起以减少操作。
这里是原始代码:
#define REDMASK (0xff0000)
#define GREENMASK (0x00ff00)
#define BLUEMASK (0x0000ff)
typedef unsigned int Pixel;
inline Pixel AddBlend( Pixel a_Color1, Pixel a_Color2 )
{
const unsigned int r = (a_Color1 & REDMASK) + (a_Color2 & REDMASK);
const unsigned int g = (a_Color1 & GREENMASK) + (a_Color2 & GREENMASK);
const unsigned int b = (a_Color1 & BLUEMASK) + (a_Color2 & BLUEMASK);
const unsigned r1 = (r & REDMASK) | (REDMASK * (r >> 24));
const unsigned g1 = (g & GREENMASK) | (GREENMASK * (g >> 16));
const unsigned b1 = (b & BLUEMASK) | (BLUEMASK * (b >> 8));
return (r1 + g1 + b1);
}`
这就是我到目前为止所得到的。我现在的问题是颜色混合不正确。我在这里做错了什么?
typedef unsigned int Pixel;
inline Pixel AddBlend( Pixel a_Color1, Pixel a_Color2 ){
const unsigned int rb = ( ( a_Color1 & 0xff00ff ) + ( a_Color2 & 0xff00ff ) );
const unsigned int g = ( a_Color1 & GREENMASK ) + ( a_Color2 & GREENMASK );
const unsigned rb1 = ( rb & 0xff00ff ) | ( 0xff00ff * ( rb >> 8 ));
const unsigned g1 = (g & GREENMASK) | (GREENMASK * (g >> 16));
return (rb1 + g1);
}
原始代码中的 (REDMASK * (r >> 24))
类型部分处理溢出的钳制值。这适用于一种颜色部分,但不适用于两种颜色。您需要将其分成两部分,一部分处理红色溢出,另一部分处理蓝色溢出。可以像原来那样处理红色溢出,但蓝色溢出需要稍微调整以忽略任何红色贡献。
BLUE_MASK * ((rb & 0x100) >> 8)
这导致
const unsigned rb1 = (rb & 0xff00ff) | (REDMASK * (r >> 24)) | (BLUE_MASK * ((rb & 0x100) >> 8));
像这样组合两种颜色是可行的,因为红色和蓝色之间有一个溢出可以占据的间隙(绿色位)。如果您使用 red/green 或 green/blue 尝试此操作,则存储在较低字节中的部分的溢出将与存储在较高字节中的部分的值发生冲突。
我有这个 RGB 混合功能。我想做的是将红色和蓝色放在一起以减少操作。
这里是原始代码:
#define REDMASK (0xff0000)
#define GREENMASK (0x00ff00)
#define BLUEMASK (0x0000ff)
typedef unsigned int Pixel;
inline Pixel AddBlend( Pixel a_Color1, Pixel a_Color2 )
{
const unsigned int r = (a_Color1 & REDMASK) + (a_Color2 & REDMASK);
const unsigned int g = (a_Color1 & GREENMASK) + (a_Color2 & GREENMASK);
const unsigned int b = (a_Color1 & BLUEMASK) + (a_Color2 & BLUEMASK);
const unsigned r1 = (r & REDMASK) | (REDMASK * (r >> 24));
const unsigned g1 = (g & GREENMASK) | (GREENMASK * (g >> 16));
const unsigned b1 = (b & BLUEMASK) | (BLUEMASK * (b >> 8));
return (r1 + g1 + b1);
}`
这就是我到目前为止所得到的。我现在的问题是颜色混合不正确。我在这里做错了什么?
typedef unsigned int Pixel;
inline Pixel AddBlend( Pixel a_Color1, Pixel a_Color2 ){
const unsigned int rb = ( ( a_Color1 & 0xff00ff ) + ( a_Color2 & 0xff00ff ) );
const unsigned int g = ( a_Color1 & GREENMASK ) + ( a_Color2 & GREENMASK );
const unsigned rb1 = ( rb & 0xff00ff ) | ( 0xff00ff * ( rb >> 8 ));
const unsigned g1 = (g & GREENMASK) | (GREENMASK * (g >> 16));
return (rb1 + g1);
}
原始代码中的 (REDMASK * (r >> 24))
类型部分处理溢出的钳制值。这适用于一种颜色部分,但不适用于两种颜色。您需要将其分成两部分,一部分处理红色溢出,另一部分处理蓝色溢出。可以像原来那样处理红色溢出,但蓝色溢出需要稍微调整以忽略任何红色贡献。
BLUE_MASK * ((rb & 0x100) >> 8)
这导致
const unsigned rb1 = (rb & 0xff00ff) | (REDMASK * (r >> 24)) | (BLUE_MASK * ((rb & 0x100) >> 8));
像这样组合两种颜色是可行的,因为红色和蓝色之间有一个溢出可以占据的间隙(绿色位)。如果您使用 red/green 或 green/blue 尝试此操作,则存储在较低字节中的部分的溢出将与存储在较高字节中的部分的值发生冲突。