Colors 在三种颜色之间插值

Colors 在三种颜色之间插值,colors,shader,Colors,Shader,我需要在颜色A和B之间进行线性插值,以便在t=0.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(

我需要在颜色A和B之间进行线性插值,以便在t=0.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


谢谢。

我将集中讨论你问题的第一行:两个颜色值或颜色向量之间的线性插值

定义标记插值中点的任意时间点:

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)

我将集中讨论你问题的第一行:两个颜色值或颜色向量之间的线性插值

定义标记插值中点的任意时间点:

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?我试图绘制方程,但它似乎是一条直线,而不是破碎的直线:*+%Tt++0% 29 +2%2F+% 28.2 ++0% 29% 3b+从+0 +到+1i假设从A到B的线性过渡,中间有TM。但是,插值中有一个中断。你在问题中没有提到这一点。断点的解可以是一个函数,它为t=tm(例如F(t)=(abs(t-tm)/(t-tm)-1)/2)提供零。然后你可以将它与颜色相乘,并且断点在那里没有分支:C=F*color1+(F-1)*color2。最后一个问题可以在t=tm处除以0。在我的例子中,t被标准化为[0..1]。方程式将如何变化?我必须设置t1=0还是t2=1?我试图绘制方程,但它似乎是一条直线,而不是破碎的直线:*+%Tt++0% 29 +2%2F+% 28.2 ++0% 29% 3b+从+0 +到+1i假设从A到B的线性过渡,中间有TM。但是,插值中有一个中断。你在问题中没有提到这一点。断点的解可以是一个函数,它为t=tm(例如F(t)=(abs(t-tm)/(t-tm)-1)/2)提供零。然后你可以将它与颜色相乘,并且断点在那里没有分支:C=F*color1+(F-1)*color2。最后一个问题可以在t=tm处被零除。