3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Android+Vulkan+Ray Tracing]3Dモデルをレンダリングしてみた

Last updated at Posted at 2022-04-23

概要

Andoridでraytracing pipelineを作成し、モデルをレンダリングできた。
ray tracing pipelineの作成方法などは他を参考にしていただくとして、ここではAndroidでの導入する際の注意点をまとめようと思う。
vulkanでのray tracing pipelineの作成方法は私も過去に記事を書いているのでそれを見ていただけるとありがたいが、他の記事を参照してただくのも理解の手助けとなると思う。
私の記事はこちら
https://qiita.com/Aqoole/items/b9801ee0b5f3388cdd4d

注意点

ヨーロッパ向けに販売されているGalaxy S22シリーズでしかray tracingを試せない。(2022/4/23現在)
Galaxy S22はヨーロッパ向けとそれ以外の地域でSoCが異なっており、

  • ヨーロッパ向け : Exynos2200 (Gpu : Samsung Xclipse 920)
  • それ以外の地域向け : Snapdragon 898

となっている。
Xclipse920はAMDとSamsungが共同開発したGPUであることから、デスクトップ向けAMD製GPUで使えたvulkanの拡張機能などが使えるようになっているため、vulkanでray tracing pipelineを作成することが可能となっている。
この記事を読んでS22を買おうと思われる方は稀だと思うが、日本で買ってもray tracingを試せないので注意してほしい。
(私はAmazon UKで買いました。)

参考画像

レンダリングしてみたのがこちら。
image.png

モデルの権利表記

Fuse Woman 1 is created by Leonardo Carvalho
https://skfb.ly/6S9UN
LICENSE Creative Commons Attribution
https://creativecommons.org/licenses/by/4.0/legalcode

手前にガラスのキューブを置いて、屈折させている。
ray tracingでは屈折や反射を簡単に書けるところが便利だと思う。

開発環境

  • Windows
  • Android Studio Bumblebee | 2021.1.1 Patch 3
  • minSdkVersion : 30 (Android 11)
  • NDK Version : 25.0.8221429

Andorid11からndkで提供される画像デコードライブラリを使用することができる。
https://developer.android.com/ndk/guides/image-decoder?hl=ja
私の実装ではこれを用いているのでminSdkVersionを30としているが、例えばstb_imageなどを使うのならこの制限の限りではない。
NDK Versionについては2022/4/23現在で最新版の25.0.8221429を必ず使用する必要がある。
このバージョンでないとvulkanのバージョンが低く、ray tracing用の関数を使うことができない。

実装の注意点

shaderのコンパイル

app/src/main/shaders/ 配下に.vert, .fragのshaderを置くと、Android Studioがプロジェクトのビルド時に自動でshaderをコンパイルしてくれていたが、ray tracing用の.rgen, .rmiss, .rchitのshaderは自動でコンパイルしてくれないので、手動でspvファイルにコンパイルする必要がある。
コンパイルしたファイルは以下に格納する。

app\build\intermediates\assets\debug\mergeDebugAssets\shaders

ログ

原因不明だが、拡張機能を有効にしているにも関わらず、有効になっていない旨のログが記録される。
拡張機能を使っている関数すべてで出力されるので、buffer device addressを取得している

vkgetdeviceaddress

でも記録されていまい、この関数はframeのupdateごとに呼ぶ関数なので、ログがvkgetdeviceaddressを使えないというもので埋まってしまう。
根本原因を調査するか、vkgetdeviceaddressの関数のときのみログに記録しないなどの対応が必要で、私は暫定で後者の対応をしている。

最後に

はてなブログにも色々書いているので、興味のある方はご覧ください。
https://blog.hatena.ne.jp/Aqoole_Hateena/aqoole-hateena.hatenablog.com/
ソースコードはGitHubに上げております。
https://github.com/kodai731/Aqoole-Engine-Android-Vulkan-Rendering-Engine-

個人的な感想

「このままでは埋もれてしまう」という謎の焦燥感に駆られて、昨年のGWの休日をすべて費やして本気でray tracingの勉強をはじめて、およそ1年たった。
その時に書いた記事がこちらで、これが私の初Qiita。
https://qiita.com/Aqoole/items/5121cd64dc88ee4d9daf
当時はサンプルコードから少し広げるだけで精一杯だったが、あれからも調査・勉強を続け、今は最近発売されたAndroidでしかできないray tracingを早めに試せていることには満足している。
Androidでray tracingされるゲームが広がったとしてもまだまだ先のことで、そもそも広がらないかもしれないが、ゲームの可能性が広がる分野ではあると思っているので、今後も調査と勉強は続けたい。
全く役に立たない、個人的な感想に最後まで目を通して頂いてありがとうございます。

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?