Open2
(保留) C-WebGL: テクスチャ転送のdeferでMipmapとCubemapに対応する
前回まででレンダリングで死なない程度には実装ができたので、適当なstubで済ませているところや未実装にしているところを実装していく。
WebGLとVulkanの違い
WebGL(= OpenGL ES)は非常に歴史的なOpenGLと操作感を揃えるために、現代のGPUとはだいぶ違うセマンティクスを想定したAPIになっている部分がある。テクスチャのアップロードはその一例で:
-
WebGL : 一度定義したテクスチャを何度でも定義しなおせる。(一度
createTexture
したものを後からCubemapとかMipmapに変更できる) -
Vulkan : テクスチャ定義はimmutableである。
vkCreateImage
の際に最初からCubemapやMipmapの仕様を与える必要がある。但し、テクスチャ自体は書き換え可能である。
このため、WebGLをVulkan上で実装する場合、WebGLの createTexture
はVulkanの vkCreateImage
に直接対応させることはできない。
端的に言えば、現代的なGPUは複数枚の画像で構成されるテクスチャ -- つまりMipmapやCubemap -- の各要素を連続したVRAMアドレスに配置する必要があり、VulkanのAPIはこれを反映している。
作戦
現状でも、テクスチャのアップロードは2段階で実施している:
- VRAMに
Buffer
の形でアップロードする - 転送命令
vkCmdCopyBufferToImage
を使ってImage
に転送する
この 2 を実際のレンダリングが行われる直前まで遅延(defer)させれば目的を達成できる。
(保留)
フレームを越えてテクスチャを設定されるケースをどうすれば良いのか思いつかないので保留。。