如何调试WebGL未捕获类型错误

时间:2013-12-29 02:16:50

标签: webgl

我正在

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,所以类型是正确的。我还尝试先设置一些其他制服,但它们也会因同样的错误而失败。

我正在重新编写一些我在编写完教程之后编写的现有代码,其中一个我要添加的是交错的顶点数据。我确信这是根本原因,然而,这是我第三次遇到这样的错误,我唯一的办法是按摩代码直到它消失。它感觉随意而且令人沮丧。

还有更多的调试技巧吗?我认为它在着色器中是一个错误。有没有办法从中获取堆栈跟踪?

1 个答案:

答案 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);