Aqoole_Hateenaの技術日記

vulkan+raytraceで色々描いてます

Android

3Dオブジェクトをタッチしているかの判定方法

結論 カメラーオブジェクトのベクトルとカメラータッチ位置をワールド座標に変換したベクトルの内積を計算し、1に近ければタッチしていると判定 補足 点と平面の距離を計算して、その距離が0に近ければ、なども考えたが、内積を考えるのが速そう。 Unityであ…

水面の表現に挑戦

水面の反射 水面に反射する草を描画してみました 課題 反射の計算が重すぎて驚異の2fpsしか出ていない 水面の頂点をすべて保持しているので、コピーで済む部分はそのようにしたい offsetをもつようにするとか 水面の頂点の計算はCPUで行っているので、GPUで…

glTFモーフィング描画(アルファテストあり)

glTFモーフィング(アルファテストあり) アルファテストを用いて透明 or notを判定することにより、必要な部分だけを取り出してモーフィングアニメーションすることができた。 モデルの権利表記 https://sketchfab.com/3d-models/yard-grass-3a67e76decc849…

morphing animation glTF

morphing glTFのモーフィングアニメーションを読み込み、androidで描画することができた。 モデルの権利表記 https://sketchfab.com/3d-models/yard-grass-3a67e76decc849c694c228eb590a9902 ライセンス:CC Atribution https://creativecommons.org/license…

glTFでmorphing (マテリアル処理なし)

Morphing morphingのアニメーションに挑戦してみた。 それっぽくはなっているが、、、合ってるのか? モデル https://sketchfab.com/3d-models/yard-grass-3a67e76decc849c694c228eb590a9902 ライセンス:CC Atribution https://creativecommons.org/license…

glTFでのアニメーション

glTFでアニメーション colladaに引き続き、glTFでもアニメーションを行うことができた。 モデルの権利表記 配布元リポジトリ https://github.com/TheThinMatrix/OpenGL-AnimationUnlicense license https://unlicense.org/ glTFでanimationを行うときの注意…

glTFでのアニメーション

glTFでアニメーション colladaに引き続き、glTFでもアニメーションを行うことができた。 モデルの権利表記 配布元リポジトリ https://github.com/TheThinMatrix/OpenGL-AnimationUnlicense license https://unlicense.org/ glTFでanimationを行うときの注意…

glTFでのモデルの描画

glTFでモデルの描画 joint情報を読み込み、静止モデルの描画をしてみた。 モデルの権利表記 配布元リポジトリ https://github.com/TheThinMatrix/OpenGL-AnimationUnlicense license https://unlicense.org/ glTFフォーマットの読み込み方 tiny glTFを用いて…

Animationの完成

Animationの実装 今までの実装では時間の取得の仕方が間違っていた。 時間の表示を正常にするとコマ飛びすることなくアニメーションが表示された。 時間の取得方法 実装当初に色々調べた際に、あまり深く調べることなく以下のstack overflowのanswerをそのま…

compute shaderでanimation部分を計算してみた

compute shaderでanimation部分の計算 vertex shaderとfragment shaderを用いるのであれば、vertex shaderでanimation後の位置に更新した後fragment shaderで色を付ければよいと思うが、raytracing pipelineでレンダリングする場合にはどの時点で位置を計算…

Animationの補間を実装してみた

アニメーション補間の実装 interpolation(補間)を実装してみた結果がこちら。 interpolationは 今のkey frame1(t1)を基にしたanimation行列を計算するときに、次のkey frame2(t2)のanimation行列も計算する。 key frame1による位置v1を計算する。 key frame2…

Animationの描画(補間なし)2

cowboy君に色を付けた 前回のcowboy君はおかしな色がついていたが、正常な色になるようにした。 方法の考察 前回はgeometryごとにvertexを作成していたので、vertexの数が少なく小メモリーとなっていたが、今回の方法ではインデックスバッファーに0から始ま…

Animationの描画(補間なし)

Animationの描画 ようやく、本当にようやくanimationの描画に成功したので、まだまだ課題は山積しているが、現状のカウボーイ君を載せる。 課題 まず、ご覧の通りわかりやすい課題があり 補間がされていないのでカクカク カウボーイ君の色が変 の改善が必要…

アニメーションポーズのレンダリングの成功

アニメーションの1ポーズのレンダリングに、ようやく成功した。 colladaファイルからモデルを読み込み、vulkanでレンダリングしている。 何カ月もかかり、本当に長かった。アニメーション用の座標変換などについても調べたので、これから記事にしたい。 それ…

Phoenix 静止状態のレンダリング

Androidに表示した画面 colladaファイルからモデル情報を読み取り、その結果をそのまま表示した図 phoenix 1モデルの権利表記 This model was created by NORBERTO-3D https://sketchfab.com/3d-models/phoenix-bird-844ba0cf144a413ea92c779f18912042 LICEN…

モデルのレンダリング完成(Android + Vulkan + Ray Tracing)

完成図 モデルのレンダリングだけでなく、キューブに反射するモデルも描けているところがray tracingポイントです。 123 前回からの変更点 調べてみると、Android 11からはandroid ndkが提供する画像デコーダライブラリが使える模様。 pngやjpegで描かれるテ…

モデルの描画(Android + Ray Tracing)

モデルのレンダリング 21思ったのと違うが、stbi_loadが使えない影響でstbi_load_from_memoryにしているからだろうか? ただ部位ごとにはtextureで区切れているので、今はこれでよしとしようか。 ガラスで透過した絵が簡単に描けるところもray tracingの強み…

モデルのレンダリング (Vulkan + Ray Tracing)

やりたいこと ray tracingパイプラインでモデルをレンダリングしたい。 モデル自体は描画されるが、うまく色がつかない。 上部のcubesはガラスをイメージし、透過できるようにしている。 モザイクのモデル stb_imageの工夫 pngなどの画像データはstb_imageの…

ガラスキューブをレイトレーシングで

ray tracingでガラスのレンダリング ガラスキューブ1ガラスキューブ2ray tracingの真骨頂といえば、透過と反射だと(個人的には)思っていて、Androidでray tracingするからには、どこまで反射と屈折の回数を増やして計算できるのだろうと思っていた。 図の例…

AndroidでRay Tracingできた

はじめに ついにAndroidでリアルタイムray tracingできる時代が来た!ということでハローワールド的にray tracingで立方体を8つ描いた図がこちら。 白背景に立方体4つをray tracingで描いてみた図スマホは最近手に取れるようになったGalaxy S22を使っています…

Android + VulkanでImguiの導入

出力例 なぜか最初の1frame目だけはimguiの部分がrenderingされていないが、2frame目以降は表示される。 fontが小さすぎて何書いているかわからない部分は今後の改善点。 1frame目1frame目以降 IMGUIの基本 こちらを参照ください。 一言で言えば、C++でGUI環…

popup windowの表示方法

動機 C/C++コード出身の人がndkを用いてandroidでコーディングする際に、追加情報などを画面に表示したいという需要はあると思う。 とりあえずコードがコンパイルできてプログラムが実行できれば、そこからは何とか勉強できる、というのが持論なので、ちょう…

重力センサーの有効化と取得方法

結論 Androidの重力センサーの有効化と値の取得は、公式サンプルコードのままではうまくいかない。 サンプル: native-activity | Android NDK | Android Developers 先に結論を書くと、以下の過程が必要 (※ASensorEventQueue_enableSensor()は必須だが、ASen…

Depth Imageの初期値設定時の注意点

初期値(clear value)より奥のfragmentは描画されないので注意が必要 Depth Value depthの値はVkPipelineDepthStencilStateCreateInfoのminDepthBoundsからmaxDepthBoundsの値に制限される。 Vulkan® 1.3.205 - A Specification (with all registered Vulkan …

Android NDKを用いたC++でのtouch位置取得方法

android_main()でコールバック関数の登録 android_appにinput eventが通知された際に呼び出されるコールバック関数を登録する。 int32_t handle_input(struct android_app* app, AInputEvent* inputEvent) { //define app process } void android_main(struc…

Bufferにデータをコピーする方法について

サンプルコード git hubで公開されている、android + vulkanでのbufferにデータをコピーするの部分について考察してみた。 android-vulkan-tutorials/tutorial05_triangle at master · googlesamples/android-vulkan-tutorials · GitHub サンプルとしては以…

main loopのsynchronization考察

サンプルコード git hubで公開されている、android + vulkanでのsynchronizationの部分について考察してみた。 android-vulkan-tutorials/tutorial05_triangle at master · googlesamples/android-vulkan-tutorials · GitHubmain loopの関数は以下 bool Vulk…

Vulkan Surface作成 on Android

Surfaceとは "Vulkan® 1.2.202 - A Specification (with all registered Vulkan extensions)"内で SurfaceはWSI(Window System Integration)の章の見出しのひとつのWSI Surfaceとして紹介されている。 つまりSurfaceとはVulkanのWindow Systemの扱い方である…

Vulkanプログラムの作成開始

VulkanプログラムをAndroid Studioで作成することを始めてみた。 サンプルコード https://github.com/googlesamples/android-vulkan-tutorials 三角形の表示やテクスチャの使用がチュートリアルとして提供されている。 windowの表示 tutorial4まで進めると、…