Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Webgl 为什么gl.CURRENT_程序总是返回相同的着色器?_Webgl - Fatal编程技术网

Webgl 为什么gl.CURRENT_程序总是返回相同的着色器?

Webgl 为什么gl.CURRENT_程序总是返回相同的着色器?,webgl,Webgl,我的程序有5个着色器,一个用于显示,另一个用于管理我的粒子。 我放置了一个onmouse事件,并在handler函数中创建了一个日志: console.log (gl.getParameter (gl.CURRENT_PROGRAM)); 在控制台上,我看到制服列表,由于该列表,我可以确定在画布上触发事件时正在处理哪个着色器 但我仍然有相同的着色器,为什么 编辑:oups…当前的\u程序是我的渲染循环中的最后一个程序…因此我猜当渲染完成时鼠标事件将触发。首先,您不应该在程序上看到任何制服。如果

我的程序有5个着色器,一个用于显示,另一个用于管理我的粒子。 我放置了一个onmouse事件,并在handler函数中创建了一个日志:

console.log (gl.getParameter (gl.CURRENT_PROGRAM));
在控制台上,我看到制服列表,由于该列表,我可以确定在画布上触发事件时正在处理哪个着色器

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


编辑:oups…当前的\u程序是我的渲染循环中的最后一个程序…因此我猜当渲染完成时鼠标事件将触发。

首先,您不应该在程序上看到任何制服。如果你这样做

第二个JavaScript不执行多任务[1]。相反,它对事件作出反应。当事件发生时,它调用该事件的侦听器JavaScript函数。这些函数运行到完成,然后调用下一个事件的侦听器

因此,在JavaScript程序中,您可能至少有两个事件侦听器。一个是requestAnimationFrame事件监听器,另一个是mousemove事件监听器。他们不会互相打断。它们都运行到完成、退出,然后浏览器执行下一个事件或进入睡眠状态,直到新事件发生

大多数WebGL程序的工作方式是在单个事件(通常是requestAnimationFrame事件)期间进行渲染。在这次活动中,他们做了如下事情

for each object
   set attributes for object
   gl.useProgram(program object needs)
   set uniforms
   draw
然后事件退出。稍后,您的mousemove事件将出现。这意味着从mousemove事件侦听器内部调用的gl.getParametergl.CURRENT_程序始终将显示requestAnimationFrame事件中使用的最后一个程序

[1] 当然除了网络工作者