3

SPIR-V特殊化定数を使用して、均一なブロック内の配列のサイズを定義しようとしています。

#version 460 core

layout(constant_id = 0) const uint count = 0;

layout(binding = 0) uniform Uniform
{
    vec4 foo[count];
    uint bar[count];
};

void main() {}

シェーダーでを宣言するとcount = 0、次のエラーでコンパイルが失敗します。

array size must be a positive integer

と 5 の特殊化を使用count = 1すると、コードはコンパイルされますが、実行時にリンクが失敗し、エイリアシングの問題が発生します。

error: different uniforms (named Uniform.foo[4] and Uniform.bar[3]) sharing the same offset within a uniform block (named Uniform) between shaders
error: different uniforms (named Uniform.foo[3] and Uniform.bar[2]) sharing the same offset within a uniform block (named Uniform) between shaders
error: different uniforms (named Uniform.foo[2] and Uniform.bar[1]) sharing the same offset within a uniform block (named Uniform) between shaders
error: different uniforms (named Uniform.foo[1] and Uniform.bar[0]) sharing the same offset within a uniform block (named Uniform) between shaders

統一ブロックのレイアウト(各メンバーのオフセット)は特殊化時に影響を受けないようfooで、barオーバーラップしています。

明示的なオフセットも機能せず、同じリンク エラーが発生します。

layout(binding = 0, std140) uniform Uniform
{
    layout(offset = 0) vec4 foo[count];
    layout(offset = count) uint bar[count];
};

これは意図した動作ですか? 見落とし?特殊化定数を使用して配列のサイズを定義できますか?

4

1 に答える 1