【发布时间】:2014-01-21 03:01:13
【问题描述】:
我已经开始使用 Dart 和 WebGL 编写一些技术演示和测试,但是我似乎无法弄清楚如何在 Dart 中调试 WebGL。
Markus Notch(Minecraft 的创造者)有一个 livestream on twitch,他也在其中使用 Dart 和 WebGL 编写了他的游戏,但是每次他搞砸了一些东西时,他都会从 WebGL 的控制台中收到一个错误日志,其中包含错误的描述.例如退房 1:13:30。遗憾的是,我在他的代码中找不到进行调试的部分。
当然,我可以使用getShaderParameter() 和getProgramParameter() 检查着色器中的错误,然后使用适当的getInfoLog() 方法获取错误日志,但是对于常规调试(例如检查INVALID_ENUM 错误)我可以使用getError() 将错误作为整数获取,但不能将其转换为枚举、错误消息或任何人类可读的调试信息。
我尝试查看web_gl.dart 的源代码,但在其中找不到任何可以进行调试的内容。
非常感谢任何帮助。
编辑:基于 Notch 的回答 Chromium(可能)会自动记录这些错误。不过,gl.getError() 不适合我,而 Chromium 控制台为空时会报告错误 1280。 :(
Edit2:找到解决方案,看看我的答案。
【问题讨论】:
-
Dart Editor 控制台中的输出看起来像是 Chrome 的重定向默认输出。如果 Chrome 检测到您的 WebGL 代码有问题,它会将输出打印到控制台,但您无法以任何方式控制它。但 Chrome 只检测严重问题。
-
关于 getError():没有简单易用的构建方式。 [webgl-debug.js][1] 带有一个名为
WebGLDebugUtils.glEnumToString(enum)的方法,可以将它们转换为命名错误。您可以使用 js-interop 使用该方法,但由于它需要使用 WebGL 进行初始化,因此它可能不起作用(我不确定 js-interop 是否可以将 Dart 渲染上下文转换为 Javascript 上下文)。如果您看一下代码,您可以使用镜像自己实现它,但这并不是一个好的解决方案。 [1]:khronos.org/webgl/wiki/Debugging