C-WebGL: 目指せWebGL2
技術的でないトピックが諸々解決しそうなので、最新のUnityをYuniframeで動作させることを目指すことに。Unityは既にDirectX9世代のGPUのサポートを切っているので、WebGL2が必須になる。
... 実はまだComputeは必須ではないが、そのうち必要になる気がするので、WebGPU Compatibility mode(OpenGL ES 3.1相当)の実装も目指したいところ。WebGL Computeは過去に提案されていて、見たところそれなりにちゃんとしている。
デバイスレベル
いくつかの拡張をセットにして "デバイスレベル" にまとめる。
- 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を実装しているが、たぶん手書きする必要があるだろう。
新しいオブジェクト
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からの乖離も大きいし。。