three.jsで作った3Dをlinuxで動作させたところ下記エラーが発生。
THREE.WebGLRenderer: Error creating WebGL context.
Windowsでは動作したのに…。
開発環境は以下。
Electron: v1.4.13
node.js: v4.4.4
three.js: 0.83.0
linux: Ubuntu14.04(64bit)
VM: Hyper-V
Electronは内部にChromeエンジンを搭載しているとのことで、まずはChromeを疑ってみる。
node.jsの影響が無いことを確認するために、前掲three.jsで多色グラデーションを試してみる。
まずはFirefoxで…。
これは問題なく動作する。
次にChrome最新版(57.0.2987.133-64bit)。
むむ…、動作せず。
デベロッパーツールで確認。
THREE.WebGLRenderer: Error creating WebGL context.
同じエラーである。
やはりChromeの問題であった。
ぐぐってみると、ChromeはWebGLのサポートを停止している模様。
[WebGL][Chrome]Chrome 10からWindows XPでのWebGLサポートを停止
でもWindowsでは動作したのに、何故linuxだけなのだろう…。
(因みにCentOS6でも動作せず。)
回避するにはchrome://flagsで「ソフトウェアレンダリングリストをオーバライド」を有効にする、といいうのが定石らしい。
これでChromeのWebGLは動作した。
あとはElectronである。
これがなかなかわからなかったのですが、ヒントはchrome://flags「ソフトウェアレンダリングリストをオーバライド」のハッシュ(#)にありました。
このフラグのハッシュ名は「ignore-gpu-blacklist」である。
なんかちょっと引く名前だ。
VMのgpuがブラックリストに載っているんでしょうか…?
ちょっと気持ち悪いんですが、これをElectronで指定できそうです。
const {app} = require('electron'); app.commandLine.appendSwitch('ignore-gpu-blacklist');
readyイベントの前に実行しなければならないので、スコープ外に記述します。
これでElectron(Ubuntu)でも無事Three.jsが動作しました。