Open2

C-WebGL: ステートトラッカーの制作

okuokuokuoku

設計

WebGLを実装するにあたって、実装を大きく2つに分割することにした。

  1. ステートトラッカー 。WebGLユーザから指定されたアクティブなテクスチャやその他のステートを保持したりクエリに応答したりする。
  2. GPUバックエンド 。ステートトラッカーの設定値を元にGPUドライバ側に指示出しを行う。

GPUバックエンドはVulkanやWebGPUでそれぞれ別々のものが必要になるが、ステートトラッカーは共通で使えるはずなので実装を省力化できる。

okuokuokuoku

ステート

OpenGL ES2の仕様書 のTable 6.2 〜 6.24 までの20ある表にOpenGL ES2のステートがまとまっている。WebGLでは LINE_WIDTH を除いてほぼ全てを実装する必要がある。

(iOSのSafariくらいしか LINE_WIDTH をまじめに実装していないため、 LINE_WIDTH はサボることにする。)

  1. Vertex Array Data (★ VAOを使う場合はVAO毎)
  2. Buffer Object State ★ Buffer object 毎
  3. Transformation state
  4. Rasterization
  5. Multisampling
  6. Textures (state per texture unit and binding point)
  7. Textures (state per texture object) ★ Texture object 毎
  8. Texture Environment and Generation
  9. Pixel Operations
  10. Framebuffer Control
  11. Pixels = pixel storeのアラインメント設定
  12. Shader Object State ★ Shader object 毎
  13. Program Object State ★ Program object 毎 (のはず)
  14. Vertex Shader State = CURRENT_VERTEX_ATTRIB
  15. Hints
  16. Implementation Dependent Values (■ 実装定数)
  17. Implementation Dependent Pixel Depths (■ 実装定数)
  18. Miscellaneous (いわゆるglGetError)
  19. Renderbuffer State ★ Renderbuffer object 毎
  20. Framebuffer State ★ Framebuffer object 毎

多くのステートはコンテキスト単位に存在するが、 "現在バインド中のオブジェクトのパラメタを設定するコマンド" (texParameter とか) によって設定されるオブジェクト毎の設定★とかユーザから設定できない実装定数■も混在しており、注意が必要になる。

今回企画上の要請から "Vulkanプラットフォームで起動したゲームをWebGLで継続する" といった操作に対応する必要もあるため、実装定数も抽象化する必要がある。

... この量を実装しないといけないのか。。