2012-11-13 20 views
0

我有一个WebGL的问题。随机“位置不适用于当前程序”错误

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

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

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

这是我的节目制作和交换功能的源代码:http://pastebin.com/zDEWWgKV

错误停止,如果我做从以下列表中任何东西:

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

有人能告诉我,什么可能会导致错误,我该如何解决?

+2

我认为这意味着你正在设置一个不是当前程序的程序(即最后一个传递给useProgram()')的程序。你可以添加一些检查来确保。 – Thomas

回答

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

+0

我知道你不能设置其他程序的位置。错误的原因是不同的,我已经修复它。但无论如何,谢谢你试图帮助。 – Triang3l

0

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

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