互补色

时间:2014-08-10 01:18:24

标签: opengl

我有一个渲染3d对象的OpenGL应用程序。我希望应用程序的用户为3D对象选择一种颜色,我想为它自动生成一种互补的背景颜色。是否有任何众所周知的算法或技术来完成这项工作?

1 个答案:

答案 0 :(得分:2)

颜色的补色通常定义为色调偏移180度的颜色。在伪代码中,这就是你要找的东西:

function complement(rgbColor)
{
    local hslColor = rgbToHsl(rgbColor)
    hslColor.h += 180.0
    hslColor.h %= 360.0

    return hslToRgb(hslColor)
}

许多库包括用于在RGB和HSL和/或HSV / HSB颜色空间之间进行转换的辅助函数。否则,请查看here以了解自己实现这些功能。

请注意,HSL和HSV / HSB不同,但色调的定义方式相同,因此在这种情况下使用哪个并不重要。同样值得注意的是,画家色轮上定义的色调与HSL / HSV / HSB的分布略有不同。

如果您可能需要处理不饱和的颜色(也称为灰度),则此功能将输出与输入相同的阴影。解决这个问题的一种可能方法是颠倒亮度并改变色调。这意味着黑色将变为白色,浅灰色将变为深灰色等。然后唯一的问题是50%灰色,其将保持50%灰色。如果这是一个问题,如果它低于50%,你可以增加50%的饱和度。对于完美的单色(r = b = g),大多数RGB到HSL转换器将报告色调为0(红色),因此这将导致50%的灰色变换为暗红色。请注意,这些变通方法假设您使用的是HSL,而不是HSV / HSB。

function getContrastingColor(rgbColor)
{
    local hslColor = rgbToHsl(rgbColor)
    hslColor.h += 180.0
    hslColor.h %= 360.0

    hslColor.l = 1.0 - hslColor.l

    if (hslColor.s < 0.5)
        hslColor.s += 0.5

    return hslToRgb(hslColor)
}