2023/7/23(日)

シャトレーゼというやつに初めて入ってみた。徒歩圏内にあるのに一度も利用したことがなく、気になっていた。

夏季だからかアイスが結構売られていた。もちろんケーキもある。あと実は和菓子っぽいものも置いてあってこれは意外だった。

いくつか買っていったが、噂通り確かに安かった。怖いほどの激安みたいな感じではないが、そんなに臆せず気軽に買える価格感。例えるならサイゼリヤに近い。


徹夜して日付も変わってしまったが、モデルの表示にこぎつけることに成功した。

これがたった1回のdrawIndexedIndirectで動いている。素晴らしい!GPU負荷の計測などはしていないので実際どのくらい効果があるのかはよく分からないが。

テクスチャ関係の処理で少し事前に予想していなかった問題に遭遇した。まず前提だが、drawIndirect1回にまとめようとするとテクスチャ切り替えの問題にぶちあたる。複数回のドローコールに分かれていればその合間にbindDescriptorSetを入れられるのだが、全てを1回にまとめている以上そのようなことは原理的にできないのだ。そこで、複数枚あるテクスチャを全てデスクリプタ配列に詰め込んでフラグメントシェーダで参照インデックスを切り替える作戦で実装した。Vulkanのデスクリプタセットにおいてデスクリプタが配列になれる仕様を初めて利用した。

layout(set = 0, binding = 1) uniform sampler2D texSampler[];

layout(location = 2) in vec2 inTexcoord;
layout(location = 4) flat in uint inTexIndex;

layout(location = 0) out vec4 outColor;

void main() {
    outColor = texture(texSampler[inTexIndex], inTexcoord);
}

ところが、実はこのユニフォーム変数を動的に切り替える実装は拡張機能を要するものだったらしい。必要な記述として、まずシェーダにひとつ。

#extension GL_EXT_nonuniform_qualifier : enable

それからVulkanのプログラム側に一つ。

auto devFeats = physicalDevice.getFeatures2();
vk::PhysicalDeviceDescriptorIndexingFeatures feati;
feati.shaderSampledImageArrayNonUniformIndexing = true;
feati.runtimeDescriptorArray = true;
feati.descriptorBindingVariableDescriptorCount = true;
feati.pNext = &devFeats;

vk::DeviceCreateInfo deviceCreateInfo;
deviceCreateInfo.pNext = &feati;

デバイス作成時にpNextにこういうものを指定してやらなければならない。この記述はSascha Willems氏のコードを参考にした。あの人本当になんでもやってる。

少々のイレギュラーはあったが、無事表示出来て良かった。今回はボーン変形の仕組みも整備しているので、現状制御側の実装が出来ていないから検証できていないが、関節を動かすこともちゃんと出来るはずだ。楽しみ。

Categories: