GLSL-为什么可以';带“uint64\u t”的t索引数组?

GLSL-为什么可以';带“uint64\u t”的t索引数组?,glsl,vulkan,Glsl,Vulkan,我的GLSL代码编译得很好: #version 450 #extension GL_EXT_shader_explicit_arithmetic_types_int64 : enable layout (local_size_x = 256) in; layout(binding = 1) buffer OutBuffer { uint64_t outBuf[]; }; void main() { uint myId = gl_GlobalInvocationID.x;

我的GLSL代码编译得很好:

#version 450
#extension GL_EXT_shader_explicit_arithmetic_types_int64 : enable

layout (local_size_x = 256) in;

layout(binding = 1) buffer OutBuffer {
    uint64_t outBuf[];
};

void main()
{
    uint myId = gl_GlobalInvocationID.x;
    outBuf[myId] = 0;
}
如果我将
myId
的类型从
uint
更改为
uint64\t
,则不会编译:

ERROR: calc.comp.glsl:13: '[]' : scalar integer expression required 

我可以只使用
uint
,但我很好奇为什么不能使用
uint64\u t

除了
uint
int
之外的任何东西在用于索引数组时都需要显式强制转换为以下类型之一:

uint64_t myId = gl_GlobalInvocationID.x;
outBuf[uint(myId)] = 0;
GL\u EXT\u shader\u explicit\u算术\u types\u***
似乎没有说明如何使用它引入索引数组的类型

它定义了隐式提升规则,例如
uint16\u t
->
uint32\u t
(定义为等同于
uint
)。
这些当然适用于函数参数,
但奇怪的是,您甚至不能使用
uint16\u t
作为数组索引,并期望它被隐式提升为'uint32\u t';您需要显式地将其强制转换为
uint
(或
uint32\u t


因此,在为数组编制索引时,我们将受制于原始GLSL规范;使用
uint
sint
,这是它知道的唯一标量整数类型。

因为OpenGL GLSL不知道什么是
uint64\u t
。。。看见关于Vulcan我不知道,但怀疑他们改变了着色器编译器的实现…谢谢你的回答。我不知道你也不能使用
uint16\t
,非常有趣。