#rgb #srgb #color #smol #random #libm #encoded-color

无std smol-rgb

一个用于(s)Rgb颜色处理的轻量级库

5 个不稳定版本

0.3.0 2023年2月10日
0.2.0 2023年1月26日
0.1.2 2021年4月2日
0.1.1 2021年3月15日
0.1.0 2021年3月1日

#136 in 数据格式

MIT/Apache

35KB
507

smol-rgb

Documentation Crates.io

一个用于(s)Rgb颜色处理的轻量级库。

快速入门

要在您的项目中使用此库,请将以下内容添加到您的Cargo.toml文件中

smol-rgb = "0.3.0"

支持无std,但需要 libm 来工作,如下所示

smol-rgb = { version = "0.3.0", default-features = false, features = ["libm"]  }

我们还支持其他三个功能: serdebytemuckrandserde 的支持适用于多种后端,如yaml、json和bincode。 rand 的支持允许您随意生成随机颜色。

这个库是为谁设计的?

这个库是为以下程序员设计的

  • 在GPU上(如游戏)进行图形工作
  • 完全或几乎完全使用sRGB(如果您不知道这是什么意思,那可能就是您),
  • 并且不关心颜色是否“正确”。

此库还可以作为学习更复杂颜色理论的良好起点。对于熟悉色彩空间的用户,您应该检查更复杂的库 palette。它非常复杂,但功能也相应强大。

另一方面,此库仅支持sRGB,并且仅设计用于帮助程序员以简单的方式处理sRGB。

它不总是RGB,但我们可以使它仅限于sRGB

纹理、颜色选择器(如egui或imgui的选取器)通常使用“编码”的sRGB。在这个库中,这意味着4个u8,每个u8描述了图像中红色(r)、绿色(g)、蓝色(b)和透明度(a)各占多少。在非常技术层面上,这是一个名为IEC 61966-2-1:1999的规范,但你不必再记住它。在这个库中,这个空间被称为EncodedColor。如果你使用Photoshop并使用颜色选择器选择一个颜色(通常),你得到的数字将是在编码的sRGB中,而这个库在EncodedColor中处理它。那个“通常”可能让你有些担心;然而,除非你知道你做了什么奇怪的事情,否则不应该。如果你在Photoshop或Aseprite中创建纹理,你将在sRGB中工作(除非你设置让它不这样做,但不要这样做)。

编码的sRGB简直是最好不过的,但它基本上在执行操作时无用。当你想要混合颜色(添加、乘法,基本上对它们做任何操作)时,你需要将这些颜色转换为“线性”空间。在这个库中,我们称之为LinearColor。而EncodedColor只是4个u8,LinearColor是4个f32,每个f32都从“编码”空间转换到“线性”空间。更完整的术语是,它们已经被从“编码sRGB”转换到“线性sRGB”,但不要想太多——基本上,现在它们可以在彼此中混合。

这什么时候会发生神奇的事情?

大多数时候,在你的库或应用程序中,你的颜色将在EncodedColor中,你不会过多地考虑它。如果你使用像egui或imgui-rs这样的工具,你将直接从颜色选择器小程序设置颜色到你的EncodedColor,然后完事。

当然,我之前已经说过几次纹理在EncodedColor中,然而,当然,当你在一个Shader中访问它们时,你可以很容易地并且正确地使用uniform给它们上色,所以它们在那个阶段也必须在线性空间中,对吧?

答案是肯定的!GPU在采样纹理时,会为你将其转换为LinearColor。它还会,如果你已经像上面设置好了你的顶点属性,对那些属性做同样的事情。甚至更令人困惑的是,在片段着色器在线性颜色上完成工作后,(一般地)它将被转换回EncodedColor以进行最终输出。这就是为什么如果你在屏幕上使用颜色选择器,你仍然会得到EncodedColor颜色!如果你的显示器本身是sRGB(很多都是),那么你甚至会以EncodedColor显示这些颜色。

我什么时候需要自己将EncodedColor转换为LinearColor?

对于大多数程序员来说,有两种情况——当你自己在CPU上混合颜色,或者当你将颜色发送到顶点或uniform,以便在GPU上与另一个LinearColor颜色(如采样纹理)混合。

你可能会想,在你阅读这篇文章之前,你通常发送的颜色都是你所说的“EncodedColor”,并且一切顺利。这可能是对的!几乎所有的游戏都有一些颜色错误,因为这是如此容易偶然发生。然而,我可能指出,可能你或艺术家只是调整了编码颜色直到混合正确,因此在GPU上看起来大致正确。或者可能还有其他奇怪的事情发生!

许可证

双重许可,MIT或APACHE 2.0。

依赖项

~0–375KB