Aqoole_Hateenaの技術日記

vulkan+raytraceで色々描いてます

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 …

Input Assemble Stageの指定

Input Assembler Stage Input Assembler Stageでの処理の記述について調べる。 graphics pipelineのstageの概要は以下に記載。 aqoole-hateena.hatenablog.com Vertex Input State レンダリングを行うためには、pipelineにデータを入力する必要がある。 デー…

Blending Stageの指定

Blending Stage Blending Stageではcolor blendの指定を行う。 aqoole-hateena.hatenablog.com color blendとは Blending combines the incoming source fragment’s R, G, B, and A values with the destination R, G, B, and A values of each sample store…

サポートされているsample count取得方法

multisamplingの機能を利用する場合の、supported sample count取得具体例(Android) VkImageFormatProperties imageFormatProp = {}; vkGetPhysicalDeviceImageFormatProperties(physicalDevice, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILI…

Rasterization Stageの指定

Rasterization Stageでの処理 rasterization stageではrasterizationとmultisamplingの処理が行われる。 それぞれVkPipelineRasterizationStateCreateInfoとVkPipelineMultisampleStateCreateInfoにパラメータを記述する。 VkPipelineRasterizationStateCrea…

Vertex Post-processing Stageの指定

Vertex Post-processing Stage 記事にあるGraphics pipeline diagramのVertex Post-processing stageでは、いわゆるClip and Cullの処理が行われる。 aqoole-hateena.hatenablog.com Clip and Cullとはworld座標から画面に表示される範囲を抽出することであ…

Shader Stageの指定

Shader Stageの指定 pipeline diagramにあるように、pipelineにはshaderを使用することにより処理を行うpipeline shader stageがある。 aqoole-hateena.hatenablog.com pipeline shader stageを指定するには、VkPipelineShaderStageCreateInfoを実装するshad…

Graphics Pipeline基礎知識

Graphics pipelineとは コマンドの入力によって、データが各ステージで処理される生産ラインのこと。 各ステージは実装によってon/offが可能だが、vertex shaderのステージだけは例外なく実装する必要がある。 Block diagram of the Vulkan pipeline Block d…

Bufferの作成とメモリ割り当てについて

vkCreateBuffer() vkCreateBuffer - Create a new buffer object // Provided by VK_VERSION_1_0 VkResult vkCreateBuffer( VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer);vkCreat…

ImageViewの作成について

vkCreateImageView ImageViewはvkCreateImageView()で作成できるが、作成にはVkImageViewCreateInfo構造体に必要な情報をインプットする必要がある。 vkCreateImageView(3) VkImageViewCreateInfo VkImageViewCreateInfo - Structure specifying parameters …

Render Passの作成について

Render passの作成 render passの作成に当たりattachmentとsubpassの記述が必要。subpassとはattachmentにアクセスするrender passのsubsetである。 Render PassとFramebufferについて - Aqoole_Hateenaの技術日記 subpassの記述にもattachmentの記述が必要…

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…

Image Layout Transitionsについて

Image Layout Transitions memory dependenciesの例としてImage Layout Transitions*1がある。 Image Layouts 仕様書にはこのように書かれている。Vulkan® 1.2.202 - A Specification (with all registered Vulkan extensions) Images are stored in impleme…

synchronizationとdependenciesについて

Synchronization 仕様書にはこのように書かれている。Vulkan® 1.2.202 - A Specification (with all registered Vulkan extensions) Synchronization of access to resources is primarily the responsibility of the application in Vulkan. The order of e…

BuffersとBuffer Viewsについて

Buffersについて 仕様書によるとVulkan® 1.2.202 - A Specification (with all registered Vulkan extensions) Vulkan supports two primary resource types: buffers and images. Resources are views of memory with associated formatting and dimensiona…

ImageとImageViewについて

Imageについて 仕様書によるとVulkan® 1.2.202 - A Specification (with all registered Vulkan extensions) Images represent multidimensional - up to 3 - arrays of data which can be used for various purposes (e.g. attachments, textures), by bind…

Render Pass, SubpassとFramebufferについて

Render Passについて 仕様書には次のように書かれている。 Vulkan® 1.2.202 - A Specification (with all registered Vulkan extensions) Draw commands must be recorded within a render pass instance. Each render pass instance defines a set of image…

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まで進めると、…

共有ライブラリの作成方法@vscode in Linux

Linux + vscodeの環境での共有ライブラリ(実行時ライブラリ、ランタイムライブラリ)の作成方法について調べた。 結論 簡単に結論から 1. 共有ライブラリの作成 clang++(g++) -fPIC -shared -o <libshared.so.1.0.0> xxx.cpp yyy.cpp ... 2. シンボリックリンクをはる ln -nfs lib</libshared.so.1.0.0>…

caustics map

youtu.be caustics mapという言葉はないかもしれませんが、今回はcausticsの強さを事前に計算するパイプラインを作成し、caustics map作成後rendering用のパイプラインでそれを使用するという方式で実装しました。 caustics mapパイプライン causticsの強さ…

夜の波の表現2

youtu.be 前回のものはcaustics部分の光の強度の計算が間違っており、水が透過しないというか、光が強すぎて水の表面しか見えない状態になってました。 今回は新たに修正したのと、一方向から風が吹いているように表現してみました。あとyoutube動画を埋め込…

夜の砂浜

youtu.be夜をイメージしたものに変更すると思ったより綺麗に描けました。 水面上に見えない光源があるイメージで、水が反射したものだけが見えています。 、、、が、YouTubeでみるとあまり綺麗に見えませんね。プログラム面で言えば前回からの更新はほとんど…

水の表現の挑戦 海のcausticsを表現したい

youtu.be波の高さを穏やかにし、water causticsをすこし目立たさせてみました。 water causticsとは水面の底に現れる模様のことです。内部のプログラム的に負荷軽減を色々行い、横長で描画面積を広げています。 AMDの6900XTという現状ではAMDのGPUで最も良い…