如何实现自定义的颜色传递功能?
我想仔细控制我的视觉刺激的颜色。我已经看到,我可以设置一个通道的伽玛,但如果我的传递函数不是很适合一个典型的伽马曲线呢?
我试过使用查找表,但是Shady的唯一LUT实现似乎只使用红色通道并同时查找所有通道,而我想要的是能够独立查找每个通道的东西,以便能够使用独立的线性R、G和B通道?
发布于 2020-09-23 21:11:36
确实,LUTs在输入端只是一维的.Shady的LUT支持根本不是为您描述的那种使用而设计的(另外,请注意,当您使用LUT时,还有其他的副作用,比如禁用抖动)。真正需要的是一些应用任意转换的方法(不一定要量化)。
从1.12版本开始,Shady就能够通过全局AddCustomColorTransformation函数以及相应的Stimulus类和全局COLORTRANS命名空间的.colorTransformation属性定制“颜色转换”。就像添加自定义函数(信号、调制或窗口函数)的其他方法一样,它向着色器注入自定义GL阴影语言的片段,并且必须在构建World之前完成。这里有一个例子,摘自Shady的更全面解释的色彩转换演示
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中来实现,这样着色器可以非常有效地完成这些转换。记住,在1.0时保持α通道值color.a不变(在Shady中,α混合中断线性化)。
https://stackoverflow.com/questions/64019588
复制相似问题