如果绑定到0个SSBO绑定点的缓冲区的大小为36(不能被uvec4 = 16整除),将返回length
函数吗?规则是什么?..
#version 430 core
layout(local_size_x=256) in;
layout(std430, binding=0) buffer B { uvec4 data[]; };
void main() {
uint s = data.length();
//some other code...
}
答案 0 :(得分:1)
对于着色器存储块,在未调整大小(运行时大小)数组上作为其最后一个成员的length()
方法将返回类型为int
的值,该值由以下公式计算:
max((buffer_object_size - offset_of_array) / stride_of_array, 0)
这意味着是否将大小为36个字节的缓冲区绑定到以下着色器存储块
layout(std430, binding=0) buffer B { uvec4 data[]; };
然后data.length()
将返回 2 。
buffer_object_size = 36
offset_of_array = 0
stride_of_array = 16
max((36 - 0) / 16, 0) = 2
请参见ARB_shader_storage_buffer_object
; Issue (19)(位于文档末尾):
在此表达式中,我们允许在着色器存储块末尾使用未调整大小的数组,并允许使用“ .length()”方法根据提供的缓冲区对象的大小来确定此类数组的大小。
可以通过反转问题(16)中描述的过程来得出派生的数组大小:array.length() = max((buffer_object_size - offset_of_array) / stride_of_array, 0)