gpt4 book ai didi

opengl-es - 自从将 SKShader 添加到 Sprite 后,如何计算当前时间?

转载 作者:行者123 更新时间:2023-12-04 13:03:20 27 4
gpt4 key购买 nike

u_time着色器中的变量告诉您​​当前时间。但是,如果您重用着色器(如 best practice according to Apple :“如果多个 Sprite 需要相同的行为,请创建一个着色器对象并将其与每个 Sprite 相关联[...]”),则 u_time从第一次添加到场景开始继续计数。这使得使用着色器难以产生某些类型的效果,例如从黑色到白色的简单渐变,如下所示:

void main() {
float duration = 3.0; // seconds
float progress = u_time / duration;

gl_FragColor = vec4(progress, progress, progress, 1.0);
}

此着色器在第一次添加到 Sprite 时按预期工作,如 u_time从零开始。但是,相同着色器代码的后续重用以非零开始 u_time .因此,后续着色器将开始全白,不会渲染预期的黑到白淡入淡出。这似乎极大地限制了 SKShader 的可能效用。 .

最佳答案

我找到了一种有效的方法,但我对它不满意。甚至可能不够满意,以至于我宁愿每次将着色器添加到场景中时都重新编译它。

总体思路是为着色器提供特定于 Sprite 的属性,用于跟踪着色器何时添加到该 Sprite 。为了计算它,跟踪着色器第一次添加到场景中的时间(我们知道 u_time 应该为零)。然后每次我们将着色器添加到 Sprite 时,取第一个时间戳和当前时间之间的差异。将该差异作为属性提供 a_startTime (这对应于我们希望 u_time 或其他位置为零的时候)。然后在着色器中,a_startTime - u_time是当前时间戳,从零开始,因为添加了着色器。

这是整个实现的样子。跟踪第一次将着色器附加到全局变量中的 Sprite ,如下所示:

static dispatch_once_t firstStartToken;
static float firstStart;

dispatch_once(&firstStartToken, ^{
firstStart = (float)CACurrentMediaTime();
});

firstStart变量标记着色器的时间戳 u_time统一为零。

我们还必须声明一个属性 a_startTimeSKShader实例有一个地方来填充当前 Sprite 的开始时间:

[shader setAttributes:@[
[SKAttribute attributeWithName:@"a_startTime" type:SKAttributeTypeFloat]]];

然后,每次将着色器添加到 SKSpriteNode , 设置 Sprite 的属性 a_startTime是相对于初始时间的当前时间 u_time .

float startTime = CACurrentMediaTime() - firstStart;
[sprite setValue:[SKAttributeValue valueWithFloat:startTime]
forAttributeNamed:@"a_startTime"];

最后,让着色器实现使用 a_startTime :

void main() {
float duration = 3.0; // seconds
float progress = (u_time - a_startTime) / duration;

gl_FragColor = vec4(progress, progress, progress, 1.0);
}

这种方法似乎有效。每次我将此着色器添加到 Sprite 时,它都会根据需要从黑色渐变为白色。

然而,我担心它依赖于 SKShader 的一些实现细节的脆弱性。 .第一个是 u_time将始终继续滴答作响:如果在 future 版本的 iOS 中出现暂停或重置为零的情况,则此代码将通过为当前时间提供负值或大值而中断。另一个潜在的破坏是我假设 u_time使用 CACurrentMediaTime() 计数,这似乎只是直接对应于 u_time 中的内容;在某些情况下,例如夏令时转换,这些计时器会发散。

关于opengl-es - 自从将 SKShader 添加到 Sprite 后,如何计算当前时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48631119/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com