为什么gl.CURRENT_PROGRAM总是返回相同的着色器?

时间:2017-03-22 11:34:39

标签: webgl

我的程序有5个着色器(1个用于显示,其他用于管理我的粒子)。 我放置了一个onmouse事件,在处理函数中,我做了一个日志:

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

在控制台上,我看到了制服列表,由于这个列表,我可以确定在画布上触发事件时正在处理哪个着色器。

但我仍然有相同的着色器,为什么?

编辑:oups ... CURRENT_PROGRAM是我的render()循环中的最后一个...所以我想当render()完成时鼠标事件就会激活。

1 个答案:

答案 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]除了网络工作者以外