0

我对 WebGL 有疑问。

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

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

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

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

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

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

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

4

2 回答 2

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

于 2012-11-14T06:24:45.007 回答
0

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

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

于 2012-11-14T06:40:10.017 回答