OpenFL - 为着色器提供时间

OpenFL - Provide time to shader

我只是创建一个着色器,它取决于当前时间。我的片段是这样的:

varying vec2 vTexCoord;
varying float vAlpha;
uniform sampler2D uImage0;
varying float time;

void main(void)
{
    vec4 color = texture2D(uImage0, SomethingTimeDependant(vTexCoord, time);
    gl_FragColor = color;
    gl_FragColor.rgb *= gl_FragColor.a;
}

所以提供我使用的时间

var param: ShaderParameter<Float> = new ShaderParameter<Float>();
param.value = [ getTimer() ];
this.data.time = param;

但只有当我失去并再次获得焦点时它才会更新。任何想法如何正确更新时间?

这里是code of the shader class

我已将您的 WaveShader 添加到 openfl-samples 的 DisplayABitmap 项目中的位图中,但没有发现您的代码有任何问题。事实上,只需更改位图的 x 每帧 "fixes" 问题。在内部,这会将 __renderDirty 和其他一些标志设置为 true,强制重新渲染。

Lib.current.stage.addEventListener(Event.ENTER_FRAME, function(e:Event) {
   bitmap.x += 0.0001;
});

这表明 OpenFL 在检测着色器参数更改方面存在一些问题。考虑在 OpenFL's issue tracker.

上创建问题

顺便说一句,着色器似乎需要几秒,而不是几毫秒(getTimer() returns)。您可以简单地除以 1000 以获得漂亮的结果:

this.data.time.value = [ getTimer() / 1000 ];