我的WebGL存在问题。
有时候,当我在我的应用程序中添加一个新着色器时,当我在2D绘图函数中设置我的图像绘制着色器的制服时,每帧都会出现uniform4f: location not for current program
错误(在Chrome控制台中显示)。< / p>
虽然我之前几次得到同样的错误,但通过做一些随机的未知操作来修复它们并不是很难。但是,当我添加一个屏幕变形着色器时,我尽我所能,甚至glFinish
(我认为错误是因为去同步而发生),但没有任何帮助。
当我尝试在控制台绘图功能中设置我的2D图像shader的vec4制服时,会发生错误。如果我交换控制台绘图功能和菜单绘图功能,则不会绘制菜单。
以下是我的程序创建和切换功能的源代码:http://pastebin.com/zDEWWgKV
如果我从以下列表中执行任何操作,则错误将停止:
有人可以告诉我,可能导致错误的原因以及如何解决?
答案 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
并在迭代所有着色器之前禁用当前属性数组来修复它。