我的程序有5个着色器(1个用于显示,其他用于管理我的粒子)。 我放置了一个onmouse事件,在处理函数中,我做了一个日志:
console.log (gl.getParameter (gl.CURRENT_PROGRAM));
在控制台上,我看到了制服列表,由于这个列表,我可以确定在画布上触发事件时正在处理哪个着色器。
但我仍然有相同的着色器,为什么?
编辑:oups ... CURRENT_PROGRAM是我的render()循环中的最后一个...所以我想当render()完成时鼠标事件就会激活。
答案 0 :(得分:1)
首先,你不应该在你的程序中看到任何制服。如果你做that's an anti-pattern
第二个JavaScript不是多任务[1]。相反,它响应事件。当事件发生时,它会调用该事件的侦听器(JavaScript函数)。这些函数运行完成,然后调用下一个事件的侦听器。
因此,在您的JavaScript程序中,您可能至少有2个事件侦听器。一个是requestAnimationFrame事件监听器,另一个是mousemove事件监听器。他们不会互相打断。它们各自运行完成,退出,然后浏览器执行下一个事件(或进入睡眠状态,直到发生新事件)。
大多数WebGL程序的工作方式是在单个事件期间呈现,通常是requestAnimationFrame事件。在此活动期间,他们会执行类似
的操作for each object
set attributes for object
gl.useProgram(program object needs)
set uniforms
draw
然后事件退出。稍后你的mousemove事件会进来。这意味着从你的mousemove事件监听器内部调用的gl.getParameter(gl.CURRENT_PROGRAM)
总是会显示你requestAnimationFrame事件中使用的最后一个程序。
[1]除了网络工作者以外