随机“位置不适用于当前程序”错误

时间:2012-11-13 17:47:01

标签: opengl-es glsl webgl uniform

我的WebGL存在问题。

有时候,当我在我的应用程序中添加一个新着色器时,当我在2D绘图函数中设置我的图像绘制着色器的制服时,每帧都会出现uniform4f: location not for current program错误(在Chrome控制台中显示)。< / p>

虽然我之前几次得到同样的错误,但通过做一些随机的未知操作来修复它们并不是很难。但是,当我添加一个屏幕变形着色器时,我尽我所能,甚至glFinish(我认为错误是因为去同步而发生),但没有任何帮助。

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

以下是我的程序创建和切换功能的源代码:http://pastebin.com/zDEWWgKV

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

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

有人可以告诉我,可能导致错误的原因以及如何解决?

2 个答案:

答案 0 :(得分:2)

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

// 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上设置制服。

答案 1 :(得分:0)

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

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