Opengl 互补色

Opengl 互补色,opengl,Opengl,我有一个OpenGL应用程序,可以渲染3d对象。我希望应用程序的用户为3D对象选择一种颜色,并自动为其生成一种互补的背景色。有什么众所周知的算法或技术可以做到这一点吗?颜色的补色通常被定义为色调偏移180度的补色。在伪代码中,这是您要查找的内容: function complement(rgbColor) { local hslColor = rgbToHsl(rgbColor) hslColor.h += 180.0 hslColor.h %= 360.0 r

我有一个OpenGL应用程序,可以渲染3d对象。我希望应用程序的用户为3D对象选择一种颜色,并自动为其生成一种互补的背景色。有什么众所周知的算法或技术可以做到这一点吗?

颜色的补色通常被定义为色调偏移180度的补色。在伪代码中,这是您要查找的内容:

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

    return hslToRgb(hslColor)
}
许多库包含用于在RGB和HSL和/或HSV/HSB颜色空间之间转换的辅助函数。否则,请看一下如何自己实现这些功能

请注意,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)
}
函数GetControltingColor(rgbColor) { 本地hslColor=rgbToHsl(rgbColor) hslColor.h+=180.0 hslColor.h%=360.0 hslColor.l=1.0-hslColor.l 如果(hslColor.s<0.5) hslColor.s+=0.5 返回hslToRgb(hslColor) }
如果输入是灰度值,那么这不会给出与输出相同的颜色吗?因此,如果OP正在寻找一种视觉上不同的颜色,无论输入颜色是什么,我不认为这适用于所有情况。@RetoKoradi是的,去饱和的颜色可能会有问题。色彩理论通常将“互补色”定义为仅在色调上不同的颜色。否则,“对比色”可能是更好的描述。我已经用一些可能的解决办法更新了答案。