Glsl 缓冲区大小不可被其类型大小整除的长度函数的行为
如果绑定到0 SSBO绑定点的缓冲区的大小为36(不能被uvec4=16的大小整除),则返回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... } 对于着色器存储块,非大小
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)