如何实现自定义颜色传递函数?
我想仔细控制我的视觉刺激的颜色。我已经看到我可以设置逐个通道的伽马,但是如果我的传递函数不能很好地拟合典型的伽马曲线怎么办?
我试过使用查找表,但似乎 Shady 唯一的 LUT 实现只使用红色通道并一次查找所有通道,而我想要一些可以独立查找每个通道的东西,以便启用使用独立的线性 R、G 和 B 通道?
1 回答
确实,LUT 在输入端只是一维的。Shady 的 LUT 支持基本上不是为您描述的那种用法而设计的(另外,请注意,当您使用 LUT 时,还有其他副作用,例如禁用抖动)。真正需要的是某种应用任意变换的方法(不一定要量化)。
从 1.12 版本开始,Shady 可以通过全局函数以及类和全局命名空间AddCustomColorTransformation
的相应.colorTransformation
属性来自定义“颜色转换” 。与添加自定义函数(信号、调制或窗口函数)的其他方法一样,它将自定义 GL 着色语言的片段注入着色器,并且必须在构建之前完成。这是一个示例,从 Shady 的更全面解释的颜色转换演示中浓缩:Stimulus
COLORTRANS
World
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.r
、color.g
和color.b
和/或通过将矩阵变换应用于 来实现color.rgb
,着色器可以非常有效地完成此操作。请记住将 alpha 通道值color.a
保持为 1.0(在 Shady 中,alpha 混合会破坏线性化)。