GLSL-为什么可以';带“uint64\u t”的t索引数组?
我的GLSL代码编译得很好: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;
#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
,非常有趣。