长度函数在缓冲区大小上的行为不能被其类型的大小整除

时间:2018-07-10 20:19:02

标签: 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...
}

1 个答案:

答案 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)