FLAXengine代码剖析

2021SC@SDUSC

Color.cpp
对颜色的定义

Color::Color(const Vector3& rgb, float a)
R(rgb.X)
, G(rgb.Y)
, B(rgb.Z)
, A(a)

RGBA通道

Struct Color
结构体 颜色

构造函数
Color(Byte, Byte, Byte, Byte)
此外还可以通过多种方法(列表、Single)传入参数来构造颜色

Fields
A
Alpha 通道值。Single类型

然后下面是一大堆(真的很多)颜色种类,就不管了。

Properties

Item[Int32]
获取或设置指定索引处的组件。Single类型

MaxColorComponent
返回最大颜色分量值: Max (r,g,b)。Single类型

MinColorComponent
返回最小颜色分量值: Min (r,g,b)。类型同上

Methods
AdjustContrast(Color, Single)
调整颜色的对比度。
返回一个Color类型

AdjustContrast(ref Color, Single, out Color)
调整颜色的对比度。

AdjustSaturation(Color, Single)
调整颜色的饱和度。返回Color类型

AdjustSaturation(ref Color, Single, out Color)
调整颜色的饱和度。 返回同上

AlphaMultiplied(Single)
返回带有 alpha 通道的颜色乘以给定的颜色。 RGB 通道保持不变。
返回color类型

Clamp(Color, Color, Color)
将值限制在指定范围内。返回color

Clamp(ref Color, ref Color, ref Color, out Color)
将值限制在指定范围内。返回color

然后是重写的两个相等判断

FromBgra(Int32)
将颜色从打包的 BGRA 整数转换
Color类型

FromHSV(Vector3, Single)
从色相[0-360] ,饱和度[0-1]和值[0-1]打包到 XYZ 矢量中创建 RGB 颜色。

Lerp(Color, Color, Single)
在颜色 a 和 b 之间线性插值。

然后是两个比较的方法;

Color32.cpp

这里先说一下Color和Color32的区别。
Color32总共存储32位的颜色,每个通道存储8位,代表从0到255之间的一个整数;
而Color对于每个颜色都存储了一个32位浮点值。

Struck Color32

构造函数
Color32(Byte, Byte, Byte, Byte)
构造一个新的 Color32,包含给定的 r,g,b,a 组件。

Fields
A
颜色的 Alpha 分量。System.Byte类型

B
颜色的蓝色分量System.Byte类型

Black
黑色。 Color32类型

G
绿色分量 byte类型

R
红色分量 Byte类型

SizeInBytes
32类型的大小,以字节为单位。
System.int32类型

Transparent
Color32类型

White
白色。Color32类型

Properties

Item[Int32]
获取或设置指定索引处的组件。
Byte类型

Methods
Lerp(Color32, Color32, Single)
在颜色 a 和 b 之间线性插值。

然后是重写运算符

回过头来看看内部的定义

Color32 Color32::Transparent(0, 0, 0, 0);
Color32 Color32::Black(0, 0, 0, 255);
Color32 Color32::White(255, 255, 255, 255);

对透明、白色、黑色的定义。

Color32::Color32(const Color& c)
{
R = static_cast(c.R * 255);
G = static_cast(c.G * 255);
B = static_cast(c.B * 255);
A = static_cast(c.A * 255);
}

把给定的color转成RGBA分量

Struct ColorGradingSettings
包含颜色分级效果呈现的设置。

Fields
ColorContrast
获取或设置颜色对比度(全局应用于整个图像)。默认值为1。
Vector4类型

ColorContrastHighlights
获取或设置颜色对比度(仅应用于高亮部分)。默认值为1。
Vector4类型

ColorContrastMidtones
获取或设置颜色对比度(仅适用于中间部分)。默认值为1。
Vector4类型

ColorContrastShadows
获取或设置颜色对比度(仅应用于阴影)。默认值为1。
Vector4类型

ColorGain
获取或设置颜色增益(全局应用于整个图像)。默认值为1。
Vector4

ColorGainHighlights
获取或设置颜色增益(仅应用于高亮部分)。默认值为1。
Vector4

ColorOffset
色偏移量
Vector4

ColorOffsetShadows
获取或设置颜色偏移量(仅应用于阴影)。默认值为0。
Vector4

ColorSaturation
获取或设置颜色饱和度(全局应用于整个图像)。默认值为1。
Vector4
Struct ColorHSV
ColorHSV(Single, Single, Single, Single)
初始化 ColorHSV 结构的新实例。

Fields
A
颜色的 alpha 分量。Single类型

H
颜色的色调。
Single类型

S
颜色的饱和度。同上

V
颜色的值。

方法里重写了到Color的转换方法以及相等判断;

public Color ToColor()
{
float hdiv = H / 60;
int hi = (int)hdiv;
float f = hdiv - hi;

float p = V * (1 - S);
float q = V * (1 - (S * f));
float t = V * (1 - (S * (1 - f)));

switch (hi)
{
case 0:
    return new Color(V, t, p, A);
case 1:
    return new Color(q, V, p, A);
case 2:
    return new Color(p, V, t, A);
case 3:
    return new Color(p, q, V, A);
case 4:
    return new Color(t, p, V, A);
default:
    return new Color(V, p, q, A);
}

}

到Color的转换函数
public static ColorHSV FromColor(Color color)
{
float max = Math.Max(color.R, Math.Max(color.G, color.B));
float min = Math.Min(color.R, Math.Min(color.G, color.B));

float delta = max - min;
float h = 0.0f;

if (delta > 0.0f)
{
    if (color.R >= max)
        h = (color.G - color.B) / delta;
    else if (color.G >= max)
        h = (color.B - color.R) / delta + 2.0f;
    else
        h = (color.R - color.G) / delta + 4.0f;
    h *= 60.0f;

    if (h < 0)
        h += 360f;
}

float s = Mathf.IsZero(max) ? 0.0f : delta / max;

return new ColorHSV(h, s, max, color.A);

}

Struct Half
半精度(16位)浮点值。

构造函数
Half(Single)

Fields
AdditionRounding
类型是System.Int32

Epsilon
1.0 + ε = 1.0的最小值
System.Single类型

ExponentRadix
指数基数。
类型System.Int32

MantissaBits
尾数的位数。
System.Int32类型

MaximumBinaryExponent
最大二进制指数。
Int32类型

MaximumDecimalExponent
十进制最大指数。
Int32类型

MaxValue
数字的最大值。
System.Single类型

MinimumBinaryExponent
最小二进制指数。

MinValue
数字的最小值。
类型Single
One
值为1.0 f 的Half。
Half类型

PrecisionDigits
精度的小数位数。
Int32类型

Zero
值为0.0 f 的Half。
Half类型

Properties

RawValue
获取或设置用于支持此半浮点数的原始16位值。
UInt16

Methods
ConvertToFloat(Half[])
将半精度值的数组转换为完全精度值。

ConvertToHalf(Single[])
将完全精度值的数组转换为半精度值。

然后是重写相等判断和重写运算符。

static_assert(sizeof(Half) == 2, “Invalid Half type size.”);
static_assert(sizeof(Half2) == 4, “Invalid Half2 type size.”);
static_assert(sizeof(Half3) == 6, “Invalid Half3 type size.”);
static_assert(sizeof(Half4) == 8, “Invalid Half4 type size.”);

写死的2,4,6,8Half 类型

Half2::Half2(const Vector2& v)
{
X = Float16Compressor::Compress(v.X);
Y = Float16Compressor::Compress(v.Y);
}

Vector2 Half2::ToVector2() const
{
return Vector2(
Float16Compressor::Decompress(X),
Float16Compressor::Decompress(Y)
);
}

构造函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值