为什么颜色向量不是由 float4 而不是 int4 或 byte4 组成?

Why aren't color vectors composed of float4 instead of int4 or byte4?

RGB 值是 0-255 整数,那么为什么选择 float4 作为矢量数据类型?

在我看来,字节是 Fuse 中颜色的理想数据类型。

首先,我假设您所说的浮点数是指 4 字节的值。

  • 4个float占用4倍内存。这不仅对 space 很重要,而且对移动内存所需的时间也很重要,因为内存带宽有限。
  • 您不能使用位掩码运算符并在浮点数上移位(嗯,可以,但这并不常见)。
  • 大多数显示技术仅限于 1600 万色,即 24 位 RGB。即使您有 12 位或 16-bit/channel 显示技术,浮点数仍然至少占用两倍的内存。
  • 并非所有平台都原生支持浮点运算。

我可能会继续前进,但你明白了。

RGB 值在某些情况下仅为 1 字节 (0-255) 值。有许多常用的颜色 spaces 使用多于或少于 1 个字节来表示颜色(例如紧凑的 8 位和 16 位颜色 spaces,或 HDR 颜色spaces 使用 16甚至每个通道 32 位)。这些不仅仅是理论上的用途,在处理图像和 GL 纹理时会使用它们。

重要的是,对于该通道,这些值中的每一个都代表一个值范围,从 0(无强度)到 1(完全强度)。这就是使用 float 的原因:它是表示规范化范围的正确语义类型。它也恰好是 Fuse 的默认图形后端 OpenGL 用来表示颜色的东西。

float 具有作为连续值的优点,这与具有离散增量的 byte 不同。这对于插值很重要。考虑两种颜色之间的动画,具有线性渐变、改变不透明度或降低饱和度;所有这些都需要在一个连续的值范围内完成,比如float。

float 还允许值在 1 左右和 0 以下。虽然这些不能反映在最终显示中,但它们在计算过程中发挥作用。如果您按顺序执行许多颜色操作,您不想过早地限制您的值。

不用担心内存带宽或存储等问题 space。实际存储的颜色值只是占用内存的一小部分。

此外,Fuse 还支持颜色表示法的常用十六进制语法。您可以使用简单的 #FAA 表示浅红色,或 #AB74FD80 表示更精确的半透明颜色。