Aqoole_Hateenaの技術日記

vulkan+raytraceで色々描いてます

compute shaderによるanimationの計算

Compute Shader

ray tracingパイプラインのみでレンダリングしているとvertex shaderでのアニメーションの計算を行わないので、compute shaderでの計算方法を模索していた。
とりあえず、ソースデータからデスティネーションデータにデータをコピーするところまでは成功。

GPU計算結果のデバッグ

shaderのデバッグで困るのが、計算結果のデバッグIDEデバッグ機能などで見れないこと。
GPU側のメモリまでは見に行けないので、デバッグ専用にGPU計算結果を一度CPU側のメモリに格納し直してから見直す必要がある。(と思う)
(他に簡単な方法があればご教授ください)

VkDeviceMemory(Local(CPU)) => VkDeviceMemory(Device(GPU)) => Data(CPU)
CPU側で準備 コピー GPUで計算 コピー data

local deviceとして使用しているdevice memoryから、compute shaderで計算後にデータを格納し直す。
方法としては、CPU=>GPUでメモリをコピーしている向きと逆向きでデータをコピーすればOK

vkMapMemory(device, bufferMemory, 0, dataSize, 0, &tmpBuffer);
memcpy(data, tmpBuffer, dataSize);
vkUnmapMemory(device, bufferMemory);

memcpy()関数自体はCで用意されている関数で

#include
void *memcpy(void *buf1, const void *buf2, size_t n);

第一引数にコピー先のメモリブロックのポインタ
第二引数にコピー元のメモリブロックのポインタ
第三引数はコピーサイズ
https://bituse.info/c_func/56

なので、vkMapMemoryでVkDeviceMemory(Device(GPU))を指定した後、memcpy()のdataに、格納したい配列のアドレスを渡す。