2017-03-22 7 views
0

私のプログラムは5つのシェーダーを持っています(1つは表示用、もう1つはパーティクル管理用)。 私はonmouseイベントを配置し、ハンドラ関数では、私がログ作っ:私は制服のリストを表示し、このリストのおかげで、私はで処理されているシェーダを識別することができますコンソールでなぜgl.CURRENT_PROGRAMは常に同じシェーダを返しますか?

console.log (gl.getParameter (gl.CURRENT_PROGRAM)); 

をイベントがキャンバスでトリガーされた瞬間

しかし、私はまだ同じシェーダを持っています、なぜですか?

編集:oups ... CURRENT_PROGRAMは、私のrender()ループの最後です。だから、render()が完了したときにマウスイベントが発生すると思います。

答えて

1

まず、あなたのプログラムに制服は見られません。あなたがそうならばthat's an anti-pattern

2番目のJavaScriptはマルチタスクではありません[1]。代わりに、イベントに応答します。イベントが発生すると、そのイベントのリスナー(JavaScript関数)が呼び出されます。これらの関数は完了まで実行され、次のイベントのリスナーが呼び出されます。

JavaScriptプログラムには、おそらく少なくとも2つのイベントリスナーがあります。 1つはrequestAnimationFrameイベントリスナ、もう1つはmousemoveイベントリスナです。彼らはお互いに干渉しません。それぞれが完了まで実行され、終了すると、ブラウザは次のイベントを実行します(または新しいイベントが発生するまでスリープ状態になります)。

ほとんどのWebGLプログラムの仕組みは、単一のイベント(通常はrequestAnimationFrameイベント)中にレンダリングされます。このイベント中、彼らは何かをします

for each object 
    set attributes for object 
    gl.useProgram(program object needs) 
    set uniforms 
    draw 

イベントが終了します。後であなたのmousemoveイベントが入ります。これは、があなたのmousemoveイベントリスナーから呼び出されたことを意味します。あなたのrequestAnimationFrameイベントから最後に使用されたプログラムが常に表示されます。

[1]ウェブワーカー用以外は

関連する問題