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];
};
これは意図した動作ですか? 見落とし?特殊化定数を使用して配列のサイズを定義できますか?