Open3

C-WebGL: 目指せWebGL2

okuokuokuoku

技術的でないトピックが諸々解決しそうなので、最新のUnityをYuniframeで動作させることを目指すことに。Unityは既にDirectX9世代のGPUのサポートを切っているので、WebGL2が必須になる。

... 実はまだComputeは必須ではないが、そのうち必要になる気がするので、WebGPU Compatibility mode(OpenGL ES 3.1相当)の実装も目指したいところ。WebGL Computeは過去に提案されていて、見たところそれなりにちゃんとしている。

https://registry.khronos.org/webgl/specs/latest/2.0-compute/

okuokuokuoku

デバイスレベル

いくつかの拡張をセットにして "デバイスレベル" にまとめる。

  • Level0 (Fixed function): GameCubeくらい。通常のFixed functionおよびEMBMを持つ。
  • Level1 (WebGL1 Common): WebGL1.0。Mali450相当。VAOは常に有効(GPUが対応していなければエミュレーションされる)
  • Level1e (WebGL1 + VTF): RaspberryPi 1〜3相当。Vertex texture fetchを追加。
  • Level2 (WebGL2): WebGL2.0。
  • Level2e (WebGL2 + ANGLE extensions): 一般的なブラウザのWebGL2.0に相当する拡張を取り込み。要するにANGLEの拡張を見せる。
  • Level3 (GLES 3.1): WebGPU compatibility profile相当。WebGL2 Computeを取り込む。

Level1 〜 Level1eとかLevel2 〜 Level2eの差分はかなり悩んでいる。

Vertex texture fetchはモダンなスキニングに必須だが、割とロースペックGPU界隈で普及しているMali4xxがサポートしておらず(統合シェーダーでないため)何とも言えない状況と言える。どちらかと言うと素のLevel1はLevel0を実装する素材に近い。現実的なワークロード(VRとか)ではLevel1eどころかLevel2以上が現代的には必須になるだろう。それでもLevel1(e)を用意するのはRaspberryPi 1のサポートのため。

Level2を用意するのは、ANGLEでないOpenGL ESスタックをサポートするため。Unity含めネイティブ系のエンジンは今でもANGLE以外のOpenGL ES3.xをサポートしているため、ANGLE拡張は必須ではない。ブラウザ上のWebGL2は全てANGLEを採用しており、基本的にはLevel2eの実装になる。

Level3はWebGPU Compatibility profileを実装できるのを目標とする。DawnとかもOpenGL ES3.x上にWebGPUを実装しているが、たぶん手書きする必要があるだろう。

okuokuokuoku

新しいオブジェクト

WebGL2では、いくつかの新しいオブジェクトが追加される。

  • Query - 2.14 Asynchronous Queries
  • Sampler - 3.8.2 Sampler Objects
  • Sync - 5.2 Sync Objects and Fences
  • TransformFeedback - 2.15.1 Transform feedback objects
  • Uniform bufferとTransform feedback buffer - 2.10 buffer objects と 2.12 Vertex shaders

更に、 VertexArrayObject も追加されているが、これに関しては既にC-WebGLに取り込んでいる。

C-WebGLのWebGL1ではGLES規格書のセクションごとにソースコードを分割したが、WebGL2については差分がきちんと分けられているのでWebGL側の分割を採用することにする。元のGLESからの乖離も大きいし。。