我正在
Uncaught TypeError: Type error
当我启用了WebGL Inspector(在Chrome中)时,此错误源自以“VM”开头并以数字序列结尾的文件(不确定代码拥有哪些代码 - 是核心浏览器行为还是WebGLInspector?)。这就是这条线。
// Call real function
var result = originalFunction.apply(context.rawgl, arguments);
我已启用the debug context并正在记录所有WebGL调用。这是打破的电话:
uniform1i(3, 0)
在WebGL检查器中,我看到索引3处的统一是我的片段着色器中的uniform sampler2D uSampler
。 API文档说这是一个GLint,所以类型是正确的。我还尝试先设置一些其他制服,但它们也会因同样的错误而失败。
我正在重新编写一些我在编写完教程之后编写的现有代码,其中一个我要添加的是交错的顶点数据。我确信这是根本原因,然而,这是我第三次遇到这样的错误,我唯一的办法是按摩代码直到它消失。它感觉随意而且令人沮丧。
还有更多的调试技巧吗?我认为它在着色器中是一个错误。有没有办法从中获取堆栈跟踪?
答案 0 :(得分:2)
uniform1i(3, 0)
无效的WebGL。统一函数需要一个WebGLUniformLocation
对象,只能通过调用gl.getUniformLocation
这与OpenGL不同。原因是你不允许在统一的位置做数学。在OpenGL中,开发人员经常犯这个错误。他们会做这样的事情
--in shader--
uniform float arrayOfFloats[4];
--in code--
GLint location = glGetUniformLocation(program, "arrayOfFloats");
glUniform1f(location, 123.0f);
glUniform1f(location + 1, 456.0f); // BAD!!!
第二行是无效的OpenGL,但它可能会起作用,具体取决于驱动程序。
在WebGL中,他们想要犯这种错误是不可能的,因为网页需要在任何地方工作,而OpenGL程序只需要在他们编译的平台上工作。为了让它在任何地方工作,gl.getUniformLocation
返回一个对象,这样你就无法对结果进行数学计算。
在OpenGL中编写上述代码的正确方法是
--in shader--
uniform float arrayOfFloats[4];
--in code--
GLint location0 = glGetUniformLocation(program, "arrayOfFloats[0]");
GLint location1 = glGetUniformLocation(program, "arrayOfFloats[1]");
glUniform1f(location0, 123.0f);
glUniform1f(location1, 456.0f);
在WebGL中是
--in shader--
uniform float arrayOfFloats[4];
--in code--
var location0 = gl.getUniformLocation(program, "arrayOfFloats[0]");
var location1 = gl.getUniformLocation(program, "arrayOfFloats[1]");
gl.uniform1f(location0, 123.0);
gl.uniform1f(location1, 456.0);