ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Godot 引擎 Color 类完全指南:RGBA 颜色、sRGB/线性编码与常用操作实战

Godot 引擎 Color 类完全指南:RGBA 颜色、sRGB/线性编码与常用操作实战 文档教程游戏开发【免费下载链接】godot-docsGodot Engine official documentation项目地址https://gitcode.com/GitHub_Trending/go/godot-docs点击查看免费下载导读Color是 Godot 引擎中所有颜色数据的核心类型无论你在 2D/3D 渲染、UI 界面、粒子系统还是脚本逻辑中处理颜色都离不开它。本文基于官方文档 classes/class_color.rst 展开系统讲解 Color 的 RGBA 表示法、属性体系、全部构造方式、命名颜色常量、核心方法与运算符并结合仓库内 HDR 输出教程 和 RichTextLabel BBCode 教程 中的真实用法帮助你彻底掌握 Godot 中颜色的正确打开方式——从会改颜色进阶到懂色彩空间、能算亮度、能正确插值。一、认识 ColorRGBA 浮点颜色类型Color是 Godot 内置的值类型struct 类型非引用类型以RGBA 格式表示一个颜色由四个分量构成r红、g绿、b蓝颜色通道aalpha透明度通道每个分量都是一个32 位浮点数通常取值在0.0到1.0之间。但请注意某些属性例如CanvasItem.modulate支持大于 1.0 的数值用于表达超亮overbright或 HDR高动态范围颜色因此 Color 本质上可以承载超出标准显示器色域的信息。1.1 默认值与布尔语义无参构造的Color默认值是不透明黑色Color(0, 0, 0, 1)与命名常量BLACK相同在 GDScript 的布尔上下文中只有等于Color(0, 0, 0, 1)不透明黑的 Color 才被判定为false其余任何 Color 都为true在 C# 中无参构造出的 Color 各分量均为0.0即透明黑与 GDScript 行为不同这是两个语言的重要差异点。二、色彩编码sRGB 非线性编码与线性编码理解 Color 类型最关键的概念是编码方式encoding。文档明确指出Godot 默认期望r、g、b三个分量使用非线性 sRGB 传递函数进行编码除非特别说明。这种颜色编码被许多传统美术工具和 Web 工具使用因此很容易在 Godot 与这些工具之间匹配颜色。Godot 使用 Rec. ITU-R BT.709 色度基色也是 sRGB 标准所使用的。这意味着默认状态下你在代码里写的Color(0.5, 0.5, 0.5)是按 sRGB 非线性编码解释的与 Photoshop、网页 CSS 里的颜色值直接对应所有物理模拟计算如光照计算和色度学变换如get_luminance()计算亮度必须基于线性编码的值才能得到正确结果进行这类计算时需要用srgb_to_linear()将颜色从 sRGB 转为线性计算完成后再用linear_to_srgb()转回 sRGB。2.1 alpha 通道的特殊规则aalpha通道始终以线性编码存储不受其他通道色彩空间的影响。linear_to_srgb()和srgb_to_linear()都不会修改 alpha 通道。这一点在 HDR 相关处理中尤其容易踩坑——见下文实战示例。2.2 HDR 输出教程中的真实用例仓库中的 HDR 输出教程hdr_output.rst提供了一个完整的 sRGB↔线性转换实战范例函数normalize_color演示了完整的正确流程func normalize_color(srgb_color, output_max_linear_value 1.0): # Color must be linear-encoded to use math operations. var linear_color srgb_color.srgb_to_linear() var max_rgb_value maxf(linear_color.r, maxf(linear_color.g, linear_color.b)) var brightness_scale output_max_linear_value / max_rgb_value linear_color * brightness_scale # Undo changes to the alpha channel, which should not be modified. linear_color.a srgb_color.a # Convert back to nonlinear sRGB encoding, which is required for Color in # Godot unless stated otherwise. return linear_color.linear_to_srgb()这段代码精确体现了三个要点先转线性再做数学运算、alpha 通道单独还原、运算完再转回 sRGB。三、属性Properties全景Color提供 14 个属性涵盖三个维度RGBA 分量、8 位整数通道封装、以及 HSV/OKHSL 色彩空间分量。属性类型默认值说明rfloat0.0红色分量通常 0.0–1.0gfloat0.0绿色分量通常 0.0–1.0bfloat0.0蓝色分量通常 0.0–1.0afloat1.0alpha 分量0 表示完全透明1 表示完全不透明始终线性编码r8int0r的 8 位整数封装范围 0–255g8int0g的 8 位整数封装范围 0–255b8int0b的 8 位整数封装范围 0–255a8int255a的 8 位整数封装范围 0–255hfloat0.0HSV 色相hue范围 0–1sfloat0.0HSV 饱和度saturation范围 0–1vfloat0.0HSV 明度value/brightness范围 0–1ok_hsl_hfloat0.0OKHSL 色相范围 0–1ok_hsl_sfloat0.0OKHSL 饱和度范围 0–1ok_hsl_lfloat0.0OKHSL 亮度lightness范围 0–1使用建议需要与美术工具、CSS 色值对接时用r/g/b/a浮点属性需要 0–255 整数直觉时如从图片像素数据读取颜色用r8/g8/b8/a8需要按色相—饱和度—明度直觉调色时可读h/s/v或ok_hsl_h/s/l。OKHSL 是基于 OKLab 色彩空间的新型 HSL 模型其感知均匀性优于传统 HSL适合需要感知上等距调色的场景。四、构造 Color 的七种方式4.1 无参构造构造出不透明黑色GDScript等价于BLACK。注意 C# 中为透明黑。4.2 从现有颜色拷贝Color(from: Color)复制一个 Color。Color(from: Color, alpha: float)复制颜色并覆盖 alpha 值var red Color(Color.RED, 0.2) # 20% 不透明的红色var red new Color(Colors.Red, 0.2f); // 20% 不透明的红色4.3 从字符串构造HTML 色值或命名颜色Color(code: String)与Color(code: String, alpha: float)可以从HTML 颜色代码或标准化颜色名称构造 Color支持的名称与常量一致不区分大小写var c1 Color(red) # 命名颜色 var c2 Color(#ff0000) # HTML 十六进制 var c3 Color(ff0000, 0.5) # 十六进制 自定义 alpha4.4 从 RGB / RGBA 浮点值构造var color Color(0.2, 1.0, 0.7) # alpha 自动为 1.0 var color2 Color(0.2, 1.0, 0.7, 0.8) # 显式指定 alphavar color new Color(0.2f, 1.0f, 0.7f); var color2 new Color(0.2f, 1.0f, 0.7f, 0.8f);五、命名颜色常量与色卡Color提供了一套基于X11 颜色名称标准化而来的命名颜色常量并额外加入了TRANSPARENTColor(1, 1, 1, 0)白色但 alpha 为 0。全套常量约 160 余个覆盖从ALICE_BLUE到YELLOW_GREEN的常用颜色例如基础色BLACK、WHITE、RED、GREEN、BLUE、AQUA、FUCHSIA、YELLOW扩展色GOLD、ORANGE、PURPLE、VIOLET、CORAL、CRIMSON、INDIGO、SALMON特殊TRANSPARENT透明、REBECCA_PURPLE完整的常量色卡速查表见仓库图片 img/color_constants.png该图以网格矩阵形式展示了全部 162 个命名颜色常量每个色块内部标注了对应的 Godot 常量名称颜色按黑、灰、棕、橙、黄、绿、青、蓝、紫、粉、透明等色系集中排列非常适合在编写 UI 配色或主题时快速检索常量名。这一套命名颜色在 RichTextLabel 的 BBCode 教程 中也有实际应用BBCode 中允许按名称指定颜色时可直接使用内置Color类的常量名且支持多种大小写风格——DARK_RED、DarkRed、darkred会得到完全相同的结果[colorDARK_RED]红色文字[/color] [color#ff0000]等价于十六进制写法[/color]六、静态构造方法从色彩空间或整数创建6.1 from_hsv(h, s, v, alpha 1.0)从HSV 色彩空间构造颜色h色相、s饱和度、v明度通常为 0.0–1.0var color Color.from_hsv(0.58, 0.5, 0.79, 0.8)var color Color.FromHsv(0.58f, 0.5f, 0.79f, 0.8f);6.2 from_ok_hsl(h, s, l, alpha 1.0)从OKHSL 色彩空间构造颜色基于 OKLab 的感知均匀色彩模型参数同样通常为 0.0–1.0var color Color.from_ok_hsl(0.58, 0.5, 0.79, 0.8)6.3 from_rgba8(r8, g8, b8, a8 255)从0–255 整数通道构造颜色内部各除以255.0得到浮点值var red Color.from_rgba8(255, 0, 0) # 等价于 Color(1, 0, 0) var dark_blue Color.from_rgba8(0, 0, 51) # 等价于 Color(0, 0, 0.2) var my_color Color.from_rgba8(306, 255, 0, 102) # 等价于 Color(1.2, 1, 0, 0.4)注意精度陷阱由于from_rgba8()的精度低于标准构造器用该方法创建的颜色通常不等于用标准构造器创建的相同颜色。比较时请使用is_equal_approx()以避免浮点精度误差。6.4 from_rgbe9995(rgbe)从RGBE9995 格式整数解码出颜色一种高动态范围编码5 位共享指数 9 位每通道尾数与 Image.FORMAT_RGBE9995 对应适合处理 HDR 图像数据。6.5 from_string(str, default)从字符串HTML 颜色代码或命名颜色不区分大小写创建颜色解析失败时返回传入的default。若要在常量表达式中从字符串创建颜色请使用等价构造器Color(color string)而非本方法。6.6 hex(hex) 与 hex64(hex)hex(hex)从32 位 RGBA 整数每通道 8 位创建颜色是to_rgba32()的逆运算。十六进制记法写作0xRRGGBBAAvar red Color.hex(0xff0000ff) var dark_cyan Color.hex(0x008b8bff) var my_color Color.hex(0xbbefd2a4)hex64(hex)从64 位 RGBA 整数每通道 16 位创建颜色是to_rgba64()的逆运算记法为0xRRRRGGGGBBBBAAAA。若要在常量表达式中使用十六进制记法可用等价构造器Color(0xRRGGBBAA)。6.7 html(rgba)从HTML 十六进制颜色字符串创建颜色不区分大小写可带#前缀。支持三位、四位、六位、八位十六进制var blue Color.html(#0000ff) # Color(0.0, 0.0, 1.0, 1.0) var green Color.html(#0F0) # Color(0.0, 1.0, 0.0, 1.0)三位缩写 var col Color.html(663399cc) # Color(0.4, 0.2, 0.6, 0.8)含 alpha无 alpha 时默认 alpha 为 1.0字符串非法时返回空颜色。6.8 html_is_valid(color)校验字符串是否为合法 HTML 十六进制颜色3、4、6 或 8 位可带#前缀与String.is_valid_html_color()完全相同Color.html_is_valid(#55aaFF) # true Color.html_is_valid(#55AAFF20) # true Color.html_is_valid(55AAFF) # true Color.html_is_valid(#F2C) # true Color.html_is_valid(#AABBC) # false5 位非法 Color.html_is_valid(#55aaFF5) # false7 位非法七、实例方法颜色计算与变换7.1 算术与混合方法说明示例blend(over)将over颜色叠加到当前颜色上含 alpha类似绘画软件中前景色盖在背景色上bg.blend(fg)50% 绿叠 50% 红 → 75% 不透明棕lerp(to, weight)与to颜色按weight0.0–1.0做线性插值red.lerp(aqua, 0.5)→Color(0.5, 0.5, 0.4)darkened(amount)按比例0.0–1.0变暗green.darkened(0.2)→ 比纯绿暗 20%lightened(amount)按比例0.0–1.0变亮green.lightened(0.2)→ 比纯绿亮 20%inverted()反转 RGB1 - r, 1 - g, 1 - b, a保留 alphaColor(0.3, 0.4, 0.9).inverted()→Color(0.7, 0.6, 0.1)clamp(min, max)各分量夹取到min/max之间默认 0–1对每个分量执行clamp()可把 HDR 超亮颜色收回到标准范围blend与lerp的完整示例# blend前景叠加背景 var bg Color(0.0, 1.0, 0.0, 0.5) # 50% 透明绿 var fg Color(1.0, 0.0, 0.0, 0.5) # 50% 透明红 var blended_color bg.blend(fg) # 棕色alpha 为 75% # lerp颜色插值可用于渐变动画、HUD 状态过渡 var red Color(1.0, 0.0, 0.0) var aqua Color(0.0, 1.0, 0.8) red.lerp(aqua, 0.2) # Color(0.8, 0.2, 0.16) red.lerp(aqua, 0.5) # Color(0.5, 0.5, 0.4) red.lerp(aqua, 1.0) # Color(0.0, 1.0, 0.8)7.2 色彩科学亮度与编码转换方法说明get_luminance()返回颜色的光强度亮度范围 0.0–1.0用于判断深浅色小于 0.5 一般视为深色。要求线性编码否则需先srgb_to_linear()srgb_to_linear()返回使用线性编码的副本要求原颜色为 sRGB 编码不影响 alphalinear_to_srgb()返回使用非线性 sRGB 编码的副本要求原颜色为线性编码不影响 alpha这两个转换方法正是色彩空间正确性的核心。例如计算一个 sRGB 颜色的相对亮度var luminance my_color.srgb_to_linear().get_luminance() # 先转线性再算亮度7.3 导出为整数与字符串Color可转换为多种 32/64 位整数格式以及 HTML 字符串方法输出格式说明to_rgba32()32 位整数每通道 8 位Godot 默认格式hex()的逆运算Color(1, 0.5, 0.2).to_rgba32()→4286526463to_rgba64()64 位整数每通道 16 位hex64()的逆运算→-140736629309441to_abgr32()32 位整数 ABGRRGBA 的反序版本→4281565439to_abgr64()64 位整数 ABGR→-225178692812801to_argb32()32 位整数 ARGB与DirectX 更兼容→4294934323to_argb64()64 位整数 ARGB与 DirectX 更兼容→-2147470541to_html(with_alpha true)不带#前缀的 HTML 字符串with_alphafalse时输出 RGB 而非 RGBAto_html示例var white Color(1, 1, 1, 0.5) white.to_html() # ffffff7fRGBA white.to_html(false) # ffffff仅 RGB7.4 比较方法方法说明is_equal_approx(to)对每个分量执行is_equal_approx()返回是否近似相等是规避浮点精度问题进行颜色比较的首选operator 严格相等比较注意浮点精度operator !严格不等比较注意浮点精度八、运算符Color 也支持算术Color重载了一系列运算符支持逐分量的算术操作color * color逐分量相乘常用于色调调制如modulate颜色叠加color * float/color * int所有分量乘以标量color color逐分量相加color - color逐分量相减color / color、color / float、color / int逐分量相除color[index]按下标访问分量[0]r、[1]g、[2]b、[3]a一元无操作仅增强可读性一元-反转整个颜色等价于Color.WHITE - c即Color(1 - c.r, 1 - c.g, 1 - c.b, 1 - c.a)——注意与inverted()不同一元负号连 alpha 也会反转实际应用示例# 用标量乘法调整整体亮度HDR 场景常用 var dimmed base_color * 0.5 # 用颜色乘法做色调映射tint var tinted base_color * Color(1.0, 0.8, 0.8) # 偏暖色调 # 下标访问 var red_component some_color[0] # 等价于 some_color.r九、C# 使用差异速查GDScriptC#Color.REDColors.Red常量定义在Colors静态类Color.ALICE_BLUEColors.AliceBlue命名颜色用 PascalCaseColor(0.2, 1.0, 0.7)new Color(0.2f, 1.0f, 0.7f)无参构造 不透明黑无参构造 透明黑全 0更多 C# 与 GDScript 的 API 差异可参考仓库中关于 C# 差异的说明文档。十、实战小结一套正确的颜色处理流程综合全文在 Godot 中处理颜色的最佳实践可归纳为写入/匹配美术资源直接用 sRGB 编码的浮点值或命名常量例如Color.html(#FF6F00)、Color.GOLD做数学运算亮度、光照、HDR 归一化之前先srgb_to_linear()转线性运算后再linear_to_srgb()转回始终记得 alpha 通道是线性的转换方法不碰 alphaHDR 缩放时需要像 hdr_output.rst 那样单独还原比较颜色使用is_equal_approx()而非尤其对from_rgba8()产生的颜色查命名颜色直接对照 img/color_constants.png 色卡检索常量名。延伸阅读原始类参考classes/class_color.rst颜色常量在 BBCode 中的应用tutorials/ui/bbcode_in_richtextlabel.rstsRGB↔线性转换的 HDR 实战tutorials/rendering/hdr_output.rst相关类型CanvasItem.modulate见 classes/class_canvasitem.rstImage.FORMAT_RGBE9995见 classes/class_image.rst赞分享文档教程游戏开发【免费下载链接】godot-docsGodot Engine official documentation项目地址https://gitcode.com/GitHub_Trending/go/godot-docs点击查看免费下载相关推荐Rerun Color 组件深度解析sRGB 空间 RGBA 颜色的编码、序列化与多语言 SDK 使用Rerun Color 组件深度解析sRGB 空间 RGBA 颜色的编码、序列化与多语言 SDK 使用 Color 是 Rerun 数据模型中用于表达颜色的核数据可视化3D渲染数据分析TiXL RgbaToColor 操作符完全指南用 RGBA 四值构造颜色与 Vector4TiXL RgbaToColor 操作符完全指南用 RGBA 四值构造颜色与 Vector4 RgbaToColor 是 TiXLLib.numbers.v音视频图形学桌面应用Kornia RGB 颜色空间转换实战指南BGR/RGBA/线性 RGB/法线编码的完整 API 解析Kornia RGB 颜色空间转换实战指南BGR/RGBA/线性 RGB/法线编码的完整 API 解析 本文以 Kornia 的 RGB 颜色转换 API 文计算机视觉人工智能深度学习图像处理上一篇【亲测免费】 PHP Markdown下一篇Mustache PHP - 渲染可重复使用的模板创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进