Opengl es “随机”;位置不适用于当前计划”;错误

Opengl es “随机”;位置不适用于当前计划”;错误,opengl-es,glsl,webgl,uniform,Opengl Es,Glsl,Webgl,Uniform,我对WebGL有意见 有时,当我在我的应用程序中添加一个新的着色器时,当我在我的2D绘图函数中设置图像绘图着色器的统一时,我开始在每一帧获得uniform4f:location not for current programerror(显示在Chrome控制台中) 虽然我以前也有过几次同样的错误,但通过一些随机未知的操作来修复它们并不困难。然而,当我添加了一个屏幕扭曲着色器时,我尝试了我所能做的一切,甚至glFinish(我认为错误是由于去同步而发生的),但没有任何帮助 当我试图在控制台绘图功能

我对WebGL有意见

有时,当我在我的应用程序中添加一个新的着色器时,当我在我的2D绘图函数中设置图像绘图着色器的统一时,我开始在每一帧获得
uniform4f:location not for current program
error(显示在Chrome控制台中)

虽然我以前也有过几次同样的错误,但通过一些随机未知的操作来修复它们并不困难。然而,当我添加了一个屏幕扭曲着色器时,我尝试了我所能做的一切,甚至
glFinish
(我认为错误是由于去同步而发生的),但没有任何帮助

当我试图在控制台绘图功能中设置2D图像的vec4一致性时,会发生错误。如果交换控制台绘图功能和菜单绘图功能,则不会绘制菜单

以下是我的程序创建和切换功能的源代码:

如果我执行以下列表中的任何操作,错误将停止:

  • 关闭菜单
  • 加载地图并进行一些3D渲染(导致程序至少切换4次)
  • 启用屏幕扭曲(导致程序切换1次)

谁能告诉我,是什么原因导致了错误,我该如何修复它?

这意味着您使用的位置来自另一个程序。程序不共享位置,即使它们使用相同的着色器。例如:

// make a vertex and a fragment shader
var vs = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vs, vSource);
gl.compileShader(vs);

var fs = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fs, fSource);
gl.compileShader(fs);

// now make 2 identical programs from those shaders
var p1 = gl.createProgram();
gl.attachShader(p1, vs);
gl.attachShader(p1, fs);
gl.linkProgram(p1);

var p2 = gl.createProgram();
gl.attachShader(p2, vs);
gl.attachShader(p2, fs);
gl.linkProgram(p2);

// Get a uniform location from program1
var location1 = gl.getUniformLocation(p1, "someUniform");

// Try to use that location on program2
gl.useProgram(p2);
gl.uniform4fv(location1, [1, 2, 3, 4]);  // ERROR!!!

不允许尝试使用程序2上程序1的位置。您必须获得程序2的位置,才能在程序2上设置制服。

有一个函数可以设置投影矩阵,并在我的代码中运行每一帧。它在所有着色器上迭代并使用程序对其执行操作,但不会更改
GL.currentprogram
,因此,如果上一帧中的最后一个着色器是
Pic
,并且当前帧中的第一个着色器也是
Pic
,但循环已停止,例如,
Warp
,我的着色器选择函数会认为当前着色器是
Pic
,而不是,并且不会更改着色器


我通过将
GL.currentprogram
设置为
null
并在迭代所有着色器之前禁用当前属性数组来修复它。

我认为这意味着您在一个不是当前程序的程序上设置了统一设置(即,最后一个传递给
useProgram()
)。您可以添加一些检查来确保。我知道您不能设置其他程序的位置。错误的原因不同,我已经修复了它。但无论如何,谢谢你的帮助。