2

如何实现自定义颜色传递函数?
我想仔细控制我的视觉刺激的颜色。我已经看到我可以设置逐个通道的伽马,但是如果我的传递函数不能很好地拟合典型的伽马曲线怎么办?
我试过使用查找表,但似乎 Shady 唯一的 LUT 实现只使用红色通道并一次查找所有通道,而我想要一些可以独立查找每个通道的东西,以便启用使用独立的线性 R、G 和 B 通道?

4

1 回答 1

0

确实,LUT 在输入端只是一维的。Shady 的 LUT 支持基本上不是为您描述的那种用法而设计的(另外,请注意,当您使用 LUT 时,还有其他副作用,例如禁用抖动)。真正需要的是某种应用任意变换的方法(不一定要量化)。

从 1.12 版本开始,Shady 可以通过全局函数以及类和全局命名空间AddCustomColorTransformation的相应.colorTransformation属性来自定义“颜色转换” 。与添加自定义函数(信号、调制或窗口函数)的其他方法一样,它将自定义 GL 着色语言的片段注入着色器,并且必须在构建之前完成。这是一个示例,从 Shady 的更全面解释的颜色转换演示中浓缩:StimulusCOLORTRANSWorld

import Shady;  Shady.RequireShadyVersion('1.12')

Shady.AddCustomColorTransformation("""

    vec4 PhotoNegative(vec4 color)
    {
        color.rgb = 1.0 - color.rgb;
        return color;
    }

""")
w = Shady.World()
s = w.Stimulus(Shady.EXAMPLE_MEDIA.alien1, frame=Shady.Integral(16))
s.colorTransformation = Shady.COLORTRANS.PhotoNegative

自定义函数的明显潜在缺点是它们要求您亲自编写实际的 GLSL 代码,这反过来意味着您要密切关注优化您正在编写的内容的计算复杂性,这样您就可以避免速度过慢.

不过,在大多数情况下,努力可能是最小的。色彩视觉研究的自定义转换可以通过单独将自定义函数应用于color.rcolor.gcolor.b和/或通过将矩阵变换应用于 来实现color.rgb,着色器可以非常有效地完成此操作。请记住将 alpha 通道值color.a保持为 1.0(在 Shady 中,alpha 混合会破坏线性化)。

于 2020-09-23T21:11:36.403 回答