【问题标题】:Detect ANGLE from JavaScript从 JavaScript 检测 ANGLE
【发布时间】:2012-11-01 20:05:21
【问题描述】:

我有一个 WebGL / Three.js 游戏,当使用 ANGLE 提供 WebGL 时,它有一个无用的着色器程序链接错误。我想在主页上向 ANGLE 用户(但不是其他人)显示一个突出的警告,以及显示切换到本机 OpenGL 渲染器的说明。如果用户不切换到本机 GL,我还想自动禁用有问题的功能(阴影)。

Three.js 没有提供检测着色器故障的好方法,我不知道如何检测 ANGLE,所以我目前正在考虑使用这个近似值:

IF Windows AND ( Chrome OR Firefox ) THEN displayWarning()

有更好的想法吗?

【问题讨论】:

  • 我知道这很糟糕,但目前我会 (1) 尝试更改着色器以解决该错误 (2) 检查 Chrome Canary 是否修复了该错误 (3) 在 @ 提交错误987654321@ 或 code.google.com/p/angleproject/issues 带有 small 可重现的情况。告诉用户切换到 OpenGL 还有其他更大的问题。 Firefox 和 Chrome 都需要 DirectX 来实现视频加速和/或 2D 文本加速等其他功能,因此如果您告诉用户切换到 OpenGL,您的应用程序可能会运行得更快,但您的用户通常会有更糟糕的体验。最好只是推动尽快修复 ANGLE。
  • @gman 我不能/不想直接更改着色器,因为它是内部 Three.js 材料,但正如我所说,我将关闭一些基于用户的功能关于这个问题的答案。生成一个 small 测试用例很难,因为 three.js 的着色器很大,我现在至少需要临时工作。我看不出将 OpenGL 用于 WebGL 会如何阻止浏览器将 DirectX 用于其他事情。由于主要使用 ANGLE,因为 DX9 驱动程序比 OpenGL 2.1 驱动程序更常见,我猜如果用户可以运行我的游戏,那么任何其他 WebGL 内容也可以。
  • 因为 DirectX 和 OpenGL 不能轻易混合使用,所以如果你想同时使用加速视频和加速文本以及 WebGL,所有它都必须基于 DirectX。

标签: javascript firefox google-chrome webgl three.js


【解决方案1】:

试试这个,它对我有用。

var _IS_ANGLE_ACTIVE = false;
...
...
var renderer = new THREE.WebGLRenderer( {  antialias: true  });
...
...
var ctx = renderer.domElement.getContext("webgl");
if (ctx==null)
    ctx = renderer.domElement.getContext("experimental-webgl");
if (ctx) {
    var h = ctx.getParameter(ctx.ALIASED_LINE_WIDTH_RANGE);
    _IS_ANGLE_ACTIVE = (h && h.length==2 && h[0]==1 && h[1]==1);
}

如果 ANGLE 处于活动状态,则变量 h 返回 [1,1] 或类似于原生 GL 的 [1,10]。

【讨论】:

    【解决方案2】:

    我会说不,因为 webgl 规范试图删除有关 GPU 等的任何特定信息。

    您可以尝试制作一个小测试用例来检测 readpixels 的特定问题并将其用作警告显示器

    【讨论】:

    • 关于 GPU 信息的要点。但我仍然认为可能会有一些信号,例如特定扩展的存在/不存在。编写一个小测试用例可能很困难,因为例如我有几个 AFAIK 相同的材料,但其中一个失败了 - 所以这个错误可能只有在我编译了几十个着色器或加载了数百兆字节的纹理之后才会出现,我不想在主页上这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    相关资源
    最近更新 更多