Glsl 缓冲区大小不可被其类型大小整除的长度函数的行为

Glsl 缓冲区大小不可被其类型大小整除的长度函数的行为,glsl,language-lawyer,Glsl,Language Lawyer,如果绑定到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 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...
}

对于着色器存储块,非大小(运行时大小)数组上的
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。


见(文件末尾):

在此表达式中,我们允许在着色器存储块的末尾使用未调整大小的数组,并允许使用“.length()”方法根据提供的缓冲区对象的大小来确定此类数组的大小
导出的数组大小可以通过反转问题(16)中描述的过程来导出:

buffer_object_size = 36
offset_of_array    =  0
stride_of_array    = 16

max((36 - 0) / 16, 0) = 2 
array.length() =
    max((buffer_object_size - offset_of_array) / stride_of_array, 0)