在我的顶点着色器中,我有一个可以从0到1变化的值,但是它没有插值。然而,我希望随着时间的推移进行插值,但我不想通过Javascript(从CPU)来实现。当其发生某些用户输入时,我希望将其从0插值到1(或者反向插值)。
我有一个递增的uTime
统一变量,我可以用于解决这个问题吗?
希望我已经清楚地解释了我的问题。谢谢您的帮助。
在我的顶点着色器中,我有一个可以从0到1变化的值,但是它没有插值。然而,我希望随着时间的推移进行插值,但我不想通过Javascript(从CPU)来实现。当其发生某些用户输入时,我希望将其从0插值到1(或者反向插值)。
我有一个递增的uTime
统一变量,我可以用于解决这个问题吗?
希望我已经清楚地解释了我的问题。谢谢您的帮助。
uTime
包含以毫秒为单位的时间。将该值除以一个时间跨度,得到一个在该时间跨度内递增1的值。fract
计算数字的小数部分。例如:uTime
的单位是秒,则timespan
必须为3.0)uniform float uTime; // time in milliseconds
void main()
{
const float timespan = 3000.0; // e.g. 3 seconds
float w = fract(uTime / timespan);
// [...]
}
对于 Hermite插值,还需要额外使用 smoothstep
:
uniform float uTime; // time in milliseconds
void main()
{
const float timespan = 3000.0; // e.g. 3 seconds
float w = smoothstep(0.0, 1.0, fract(uTime / timespan));
// [...]
}
通过使用sin
,可以实现另一种不错的效果。Sine给出的值在弧度[0.0, 2*PI]内随角度连续变化,取值范围为-1.0到1.0,例如:
uniform float float uTime; // time in milliseconds
void main()
{
const float timespan = 3000.0; // e.g. 3 seconds
float 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。不需要计算分数部分,而是将当前时间和起始时间之差的clamp
限制在0.0到1.0的范围内。例如:uniform float uTime; // time in milliseconds
uniform float uStartTime;
void main()
{
const float timespan = 3000.0; // e.g. 3 seconds
float w = clamp((uTime-uStartTime) / timespan, 0.0, 1.0);
// [...]
}
float
的统一变量(uTarget),并将其设置为0.0或1.0。该值定义了插值目标:uniform float uTime; // time in milliseconds
uniform float uStartTime;
uniform float uTarget; // 0.0 or 1.0
void main()
{
const float timespan = 3000.0; // e.g. 3 seconds
float w = clamp((uTime-uStartTime) / timespan, 0.0, 1.0);
w = mix(1.0-w, w, uTarget);
// [...]
}
uStartTime
从0开始。那么,每次我的值发生变化时,我应该以毫秒为单位设置 uStartTime
吗?由于 uStartTime
与持续增加的 uTime
进行比较,所以我需要根据 uTime
计算特定的值吗?或者它可以是1和0吗? - Fabian Tjoe A OnuStartTime
。将同一时间设置为 uTime
中设置的时间。每帧都会设置 uTime
,但仅在值更改时才设置 uStartTime
。 - Rabbid76uTime
)使其双向插值呢? - Fabian Tjoe A On
shared
或SSBOs)。 - Andrea