Open2
C-WebGL: ステートトラッカーの制作
設計
WebGLを実装するにあたって、実装を大きく2つに分割することにした。
- ステートトラッカー 。WebGLユーザから指定されたアクティブなテクスチャやその他のステートを保持したりクエリに応答したりする。
- GPUバックエンド 。ステートトラッカーの設定値を元にGPUドライバ側に指示出しを行う。
GPUバックエンドはVulkanやWebGPUでそれぞれ別々のものが必要になるが、ステートトラッカーは共通で使えるはずなので実装を省力化できる。
ステート
OpenGL ES2の仕様書 のTable 6.2 〜 6.24 までの20ある表にOpenGL ES2のステートがまとまっている。WebGLでは LINE_WIDTH
を除いてほぼ全てを実装する必要がある。
(iOSのSafariくらいしか LINE_WIDTH
をまじめに実装していないため、 LINE_WIDTH
はサボることにする。)
- Vertex Array Data (★ VAOを使う場合はVAO毎)
- Buffer Object State ★ Buffer object 毎
- Transformation state
- Rasterization
- Multisampling
- Textures (state per texture unit and binding point)
- Textures (state per texture object) ★ Texture object 毎
- Texture Environment and Generation
- Pixel Operations
- Framebuffer Control
- Pixels = pixel storeのアラインメント設定
- Shader Object State ★ Shader object 毎
- Program Object State ★ Program object 毎 (のはず)
- Vertex Shader State =
CURRENT_VERTEX_ATTRIB
- Hints
- Implementation Dependent Values (■ 実装定数)
- Implementation Dependent Pixel Depths (■ 実装定数)
- Miscellaneous (いわゆるglGetError)
- Renderbuffer State ★ Renderbuffer object 毎
- Framebuffer State ★ Framebuffer object 毎
多くのステートはコンテキスト単位に存在するが、 "現在バインド中のオブジェクトのパラメタを設定するコマンド" (texParameter
とか) によって設定されるオブジェクト毎の設定★とかユーザから設定できない実装定数■も混在しており、注意が必要になる。
今回企画上の要請から "Vulkanプラットフォームで起動したゲームをWebGLで継続する" といった操作に対応する必要もあるため、実装定数も抽象化する必要がある。
... この量を実装しないといけないのか。。