Aqoole_Hateenaの技術日記

vulkan+raytraceで色々描いてます

Vulkanプログラムの作成開始

VulkanプログラムをAndroid Studioで作成することを始めてみた。

サンプルコード

https://github.com/googlesamples/android-vulkan-tutorials
三角形の表示やテクスチャの使用がチュートリアルとして提供されている。

windowの表示

tutorial4まで進めると、何もない青いwindowが表示できるところまで進めることができる。

f:id:Aqoole_Hateena:20211031231941p:plain
windowの出力

triangleの表示(Hello World)

グラフィクス関連のhallo worldと言えば三角形の表示だが、tutorial5のtriangleの表示を進めていると、memcpy関数でエラーする。

  void* data;
  CALL_VK(vkMapMemory(device.device_, deviceMemory, 0, allocInfo.allocationSize, 0, &data));
  memcpy(data, vertexData, sizeof(vertexData));
  vkUnmapMemory(device.device_, deviceMemory);
  CALL_VK(vkBindBufferMemory(device.device_, buffers.vertexBuf_, deviceMemory, 0));

この部分のコード自体はバッファ領域をmapするときによく見かけるコードである。どうもデバッグした感じ、memcpy実行時にエラーしている模様だが、プログラムが実行不能になりエラーコードの確認もできないので、現状調査中というステータス。
何かわかれば、このページを更新するか、新たに内容をまとめたページを起こす予定。

まとめ

Samsungの次期スマートフォンのSocはRay Tracingをサポートするかも、ということでVulkan on Androidに手を出してみたが、APIのバージョンであるとかJava上でC++のモジュールを動かす仕組みとかの理解が必要で、前途多難の予感。

https://www.lowyat.net/2021/254890/samsung-confirms-ray-tracing-support-with-exynos-2200-soc/


しかしながらスマートフォンの上でRay Tracingをレンダリングできれば色々面白いことができると思うので、基礎から少しずつ仕組みを調査していきたい所存。

2021/12/3追記

memcpyの原因については結局不明で、どうもGPUドライバー関係の可能性あり。
私はLinux + AMD GPUの環境で構築しており、32bit版のドライバパッケージが昔からうまく入ってなかったが、これが悪さをしていた可能性があるので、OSをWindowsの環境に変更した。

変更後、git hubに置かれているコードは実行可能だが、
・画像が期待通りのものが出力されない
・validation layerをinstance extensionで有効にすると、最初のvkQueueSubmit()で失敗する

f:id:Aqoole_Hateena:20211203200234p:plain
三角形のはず

色々問題があるので、基礎から調べ直す所存。

(2022/02/02追記)
Virtual Emulatorだとうまく描かれないが、physical deviceだと正常に描かれる。
低レイアーのプログラムを動かすときは、仮想マシンは避けた方がよさそう。