Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于时间插值变化值(glsl)_Javascript_Glsl_Shader - Fatal编程技术网

Javascript 基于时间插值变化值(glsl)

Javascript 基于时间插值变化值(glsl),javascript,glsl,shader,Javascript,Glsl,Shader,我的顶点着色器中有一个统一的值,该值可以从0更改为1,而无需插值。然而,我希望随着时间的推移对其进行插值,但我不希望在Javascript中(从CPU)这样做。我希望它在变化时(在某些用户输入上发生)从0插值到1(或返回) (我确实有一个递增的uTime制服,我想我可以用它来解决这个问题) 我希望这能足够清楚地解释我的问题。TIA.我想,uTime包含以毫秒为单位的时间。将该值除以时间跨度,得到的值在时间跨度内递增1。 该值的小数部分从0.0持续更改为1.0,并在0.0处再次开始。数字的小数部分

我的顶点着色器中有一个统一的值,该值可以从0更改为1,而无需插值。然而,我希望随着时间的推移对其进行插值,但我不希望在Javascript中(从CPU)这样做。我希望它在变化时(在某些用户输入上发生)从0插值到1(或返回)

(我确实有一个递增的
uTime
制服,我想我可以用它来解决这个问题)


我希望这能足够清楚地解释我的问题。TIA.

我想,
uTime
包含以毫秒为单位的时间。将该值除以时间跨度,得到的值在时间跨度内递增1。
该值的小数部分从0.0持续更改为1.0,并在0.0处再次开始。数字的小数部分可以通过以下公式计算。e、 g:
(如果
uTime
的单位为秒,则
timespan
必须为3.0)

统一浮点uTime;//以毫秒为单位的时间
void main()
{
常量浮点时间跨度=3000.0;//例如3秒
浮动w=分形(使用时间/时间跨度);
// [...]
}
作为附加用途:

统一浮点uTime;//以毫秒为单位的时间
void main()
{
常量浮点时间跨度=3000.0;//例如3秒
float w=平滑步长(0.0,1.0,分形(uTime/timespan));
// [...]
}
另一个很好的效果可以通过使用。根据[0.0,2*PI]中的角度,给出一个在-1.0和1.0之间连续变化的值,例如:

统一浮点uTime;//以毫秒为单位的时间
void main()
{
常量浮点时间跨度=3000.0;//例如3秒
浮动w=sin(2.0*3.14159*uTime/timespan)*0.5+0.5;
// [...]
}

如果要在某个时间点开始动画,则需要第二个统一变量(
uStartTime
),该变量指示时间点。变量的单位必须与
uTime
相同
当需要启动动画时,设置
uStartTime
的值。开始时,其值为0。如果
uStartTime
小于或等于
uTime
,则动画为0.0。当设置了
uStartTime
时,这种情况很少见,而且只是暂时的。它
uTime
大于或等于
uStartTime+timespan
动画为1.0。不计算小数部分,而是将当前时间和开始时间之差调整为0.0到1.0的范围。e、 g:

统一浮点uTime;//以毫秒为单位的时间
均匀浮动时间;
void main()
{
常量浮点时间跨度=3000.0;//例如3秒
浮动w=夹具((uTime uStartTime)/时间跨度,0.0,1.0);
// [...]
}

如果要根据“方向”设置插值方向(从0到1或从1到0),则需要一些附加信息。添加另一个
float
类型的统一变量(uTarget),并将其设置为0.0或1.0。该值定义插值目标:

统一浮点uTime;//以毫秒为单位的时间
均匀浮动时间;
均匀浮点uTarget;//0.0或1.0
void main()
{
常量浮点时间跨度=3000.0;//例如3秒
浮动w=夹具((uTime uStartTime)/时间跨度,0.0,1.0);
w=混合物(1.0-w,w,uTarget);
// [...]
}

您需要告诉顶点着色器移动方向是什么,是启用还是禁用,因为它不知道以前的状态是什么。剩下的你可以用你的时间单位来做。感谢你的洞察力,你是指传递另一个单位还是将以前的状态存储在一个变量中@Andrei考虑的是前者,但仔细想想,你可以使用着色器可以写入和读取的某种类型的持久性存储(例如,
共享的
或SSBO)来跟踪状态变化。很有趣,但我想我必须尝试发送另一种统一,我使用的是WebGL 1,我不太确定我是否可以选择使用SSBOs yetThanks!回答得又好又详细。uTime实际上是以毫秒为单位的时间。我没想到用这个均匀体的分形部分来插值。。然而,我想这并不能完全回答我的问题,这清楚地说明了如何使用uTime统一进行插值,但我真正想要的是,每当我的值发生变化时,在正确的方向上进行插值。谢谢您的编辑!据我所知,
uStartTime
从0开始。然后,我应该在每次值更改时以毫秒(相同单位)为单位设置
uStartTime
?当
uStartTIme
与不断增加的
uTime
进行比较时,我是否需要根据
uTime
计算一个特定的值,或者它可以是1和0?@fabiantjoea只要在值更改时设置
uStartTIme
。与设置为
uTime
的时间相同
uTime
在每一帧中都设置,但是
uStartTime
仅在值更改时设置。是的,这起作用:)。但是,插值现在是单向的,它只从0到1进行插值,我如何让它根据变化的值在两个方向上进行插值(所以不是
uTime
,而是将1更改为0并返回的值)?@FabianTjoeAOn每次方向改变时,值都会更改0->1->0?或者,您的意思是必须分别根据方向0->1 1->0进行更改?