【问题标题】:Interpolate between three colors在三种颜色之间进行插值
【发布时间】:2013-01-14 20:25:22
【问题描述】:

我需要在颜色 A 和 B 之间进行线性插值,以便在 t=.1 时颜色为 0.5A + 0.5B。我怎样才能做到这一点?

我需要在着色器中使用它,所以条件语句不是一个选项,因为分支会变得很慢。我需要表达式形式的解决方案。

这是我的解决方案,速度很慢:

fixed3 color1= lerp(colorA, colorB, (1.0 - t) * .5 );
fixed3 borderColor= lerp(colorA, colorB, (1.0 - .1) * .5);
fixed3 color2= lerp(colorA, borderColor, t * 10.0 );

finalColor = lerp(color2, color1, saturate( (t - .1) * 100000.0) );

最后一个 lerp 是确保插值是 0 或 1。

谢谢。

【问题讨论】:

    标签: colors shader


    【解决方案1】:

    我将专注于您问题的第一行:两个颜色值或颜色向量之间的线性插值。

    您定义一个任意时间点来标记插值的中间点:

    tm = 0.1
    

    对于颜色矢量C(t)的计算,您还需要定义开始时间t1或结束时间t2,或两者:

    t1 = t2 - 2*(t2-tm) = 2*tm - t2
    t2 = t1 + 2*(tm-t1) = 2*tm - t1
    

    要在颜色 A 到颜色 B 之间进行转换,您可以像这样计算颜色分量:

    C = A + (B - A) * (t - t1) / (t2 - t1)
    

    【讨论】:

    • 在我的例子中,t 被标准化为 [0..1]。方程将如何变化?我必须设置 t1=0 还是 t2=1?我试图绘制方程,但它似乎是一条直线,而不是一条折断的线:wolframalpha.com/input/?i=plot+0+%2B+%281+-+0%29+*+%28t+-+0%29+%2F+%28.2-+0%29%3B+from +0+到+1
    • 我假设从颜色 A 到 B 的线性过渡,中间是 tm。但是,您的插值中断了。你没有在问题中提到这一点。断点的解决方案可以是一个函数,对于 t=tm 给出 1(例如 F(t)=(abs(t-tm)/(t-tm)-1)/2 ) .然后你可以将它与颜色相乘,并且没有分支的中断存在:C=F*color1+(F-1)*color2。最后一个问题可能是在 t=tm 时除以零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 2020-10-18
    • 2013-07-06
    • 2014-09-14
    • 2012-09-12
    • 1970-01-01
    相关资源
    最近更新 更多