【问题标题】:Random "location not for current program" error随机“位置不适用于当前程序”错误
【发布时间】:2012-11-02 04:29:55
【问题描述】:

我对 WebGL 有疑问。

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

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

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

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

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

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

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

【问题讨论】:

  • 我认为这意味着您正在为一个不是当前程序的程序设置制服(即最后一个传递给useProgram())。您可以为此添加一些检查以确保。

标签: opengl-es glsl webgl uniform


【解决方案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 上设置制服。

【讨论】:

  • 我知道你不能设置另一个程序的位置。错误的原因不同,我已经修复了它。但无论如何,感谢您的帮助。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-14
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多