OpenGL 颜色

Reading time ~1 minute

RGBA颜色

现实世界中有无数种颜色,然而我们使用计算机模拟颜色并不可能实现无数种。 颜色可以数字化的由红色(Red)、绿色(Green)和蓝色(Blue)三个分量组成,A(Alpha)表示透明度。缩写为RGBA。

  • 16位色: 有RGB 555,RGB 565两种分配方式。

  • RGB24: 一般RGB一种颜色用8位表示,即共有0-255,256级亮度。256级的RGB色彩总共能组合出约1678(256×256×256)万种色彩。也称为24位色。

  • RGB32: RGB32使用32位来表示一个像素,RGB分量各用去8位,剩下的8位用作Alpha通道或者不用。

  • 16进制表示: 颜色也可以用16进制表示,8位颜色对应2位16进制数。 如“#FF0000”为红色,FF就是255。

CMYK 颜色

除了RGB模式,还有CMY颜色模式。 CMY模式是指采用青色(Cyan)、品红色(Magenta)、黄色(Yellow)。K:定位套版色(黑色),有些地方解释K指代Black黑色。 每种颜色分量的取值范围为0~100。 在CMY模型中,显示的色彩不是直接来自于光线的色彩,而是光线被物体吸收掉一部分之后反射回来的剩余光线所产生的。因此,光线都被吸收时显示为黑色,当光线完全被反射时显示为白色。

RGB是相加混色模式,是一种发光的色彩模式,每种颜色分量越多,得到的颜色越亮,通常用于计算机显示。 CMY是相减混色模式,是一种依靠反光的色彩模式。多用在印刷品。

HSB模式

我们还常见HSB模式。其中,H(hues)表示色相,S(saturation)表示饱和度,B(brightness)表示亮度。 HSB模式对应的媒介是人眼。

色相(H,hue):在0~360°的标准色轮上,色相是按位置度量的。 饱和度(S,saturation):表示色彩的纯度,为0时为灰色。白、黑和其他灰色色彩都没有饱和度的。在最大饱和度时,每一色相具有最纯的色光。取值范围0~100%。 亮度(B,brightness或V,value):是色彩的明亮度。为0时即为黑色。最大亮度是色彩最鲜明的状态。取值范围0~100%。

OpenGL 颜色

现实中看到的物体颜色并不是这个物体的真实颜色,而是它所反射(Reflected)的颜色。换句话说,那些不能被物体吸收(Absorb)的颜色(被反射的颜色)就是我们能够感知到的物体的颜色。 例如,太阳光被认为是由许多不同的颜色组合成的白色光(如下图所示)。如果我们将白光照在一个蓝色的玩具上,这个蓝色的玩具会吸收白光中除了蓝色以外的所有颜色,不被吸收的蓝色光被反射到我们的眼中,使我们看到了一个蓝色的玩具。下图显示的是一个珊瑚红的物体,它以不同强度的方式反射了几种不同的颜色。

正如你所见,白色的阳光是一种所有可见颜色的集合,上面的物体吸收了其中的大部分颜色,它仅反射了那些代表这个物体颜色的部分,这些被反射颜色的组合就是我们感知到的颜色(此例中为珊瑚红)。

这些颜色反射的规律被直接地运用在图形领域。我们在OpenGL中创建一个光源时都会为它定义一个颜色。当我们把光源的颜色与物体的颜色相乘,所得到的就是这个物体所反射该光源的颜色(也就是我们感知到的颜色)。 我们来定义一个珊瑚红色的玩具,一个白色的光源,计算反射颜色来看看:

1
2
3
glm::vec3 lightColor(1.0f, 1.0f, 1.0f);
glm::vec3 toyColor(1.0f, 0.5f, 0.31f);
glm::vec3 result = lightColor * toyColor; // = (1.0f, 0.5f, 0.31f);

可以看到物体对红、黄、蓝都进行了不同程度的反射,这是由物体本身的颜色决定的。这也代表着现实中的光线原理。由此,我们可以定义物体的颜色为这个物体从一个光源反射各个颜色分量的多少。现在,如果我们使用一束绿色光源呢?

1
2
3
glm::vec3 lightColor(0.0f, 1.0f, 0.0f);
glm::vec3 toyColor(1.0f, 0.5f, 0.31f);
glm::vec3 result = lightColor * toyColor; // = (0.0f, 0.5f, 0.0f);

因为没有红色和蓝色的光让它吸收或反射,物体变成了深绿色。再把光源换个颜色:

1
2
3
glm::vec3 lightColor(0.33f, 0.42f, 0.18f);
glm::vec3 toyColor(1.0f, 0.5f, 0.31f);
glm::vec3 result = lightColor * toyColor; // = (0.33f, 0.21f, 0.06f);

如你所见,我们可以通过物体对不同颜色光的反射来的得到意想不到的不到的颜色,创作颜色变得非常简单。


参考: LearnOpenGL-CN 颜色

Scriptable Objects 及 游戏架构

Scriptable Objects 相关介绍,及基于其的游戏架构技术 Continue reading

AssetBundle 最佳实践

Published on January 29, 2019

AssetBundle 基础总结

Published on January 27, 2019