OpenFL - 为着色器

时间:2017-12-12 13:45:27

标签: glsl shader haxe openfl

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

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

1 个答案:

答案 0 :(得分:3)

我将您的WaveShader添加到openfl-samples的DisplayABitmap项目中的位图中,并且找不到您的代码有任何问题。事实上,只需更改位图的x每帧“修复”问题。在内部,这会将__renderDirty和其他一些标志设置为true,从而强制重新渲染。

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

这表明OpenFL在检测着色器参数更改时存在一些问题。考虑在OpenFL's issue tracker上创建问题。

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

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