Open2

(保留) C-WebGL: テクスチャ転送のdeferでMipmapとCubemapに対応する

okuokuokuoku

前回まででレンダリングで死なない程度には実装ができたので、適当な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段階で実施している:

  1. VRAMに Buffer の形でアップロードする
  2. 転送命令 vkCmdCopyBufferToImage を使って Image に転送する

この 2 を実際のレンダリングが行われる直前まで遅延(defer)させれば目的を達成できる。

okuokuokuoku

(保留)

フレームを越えてテクスチャを設定されるケースをどうすれば良いのか思いつかないので保留。。