基于std430布局的OpenGL SSBO数据尺寸及GLBuffer参数问询
std430布局下着色器存储缓冲区尺寸计算与参数取值
一、Light结构体尺寸计算(std430布局)
根据OpenGL std430内存布局规则,结构体成员需满足严格的对齐要求,具体计算如下:
float range:标量类型占4字节,但后续vec3 position要求16字节对齐,因此range后需填充12字节,使这部分总占用16字节(满足后续成员的对齐规则)。vec3 position:std430中vec3类型强制对齐到16字节,实际占用16字节(3个float共12字节,额外填充4字节)。vec3 color:遵循vec3的对齐规则,同样占用16字节。
最终Light结构体总尺寸:48字节(16 + 16 + 16),且48是最大对齐值16的整数倍,符合std430布局要求。
二、LocalLights缓冲区总尺寸(含10个Light元素)
缓冲区包含两部分内容:
uint activeLightCount:标量占4字节,由于后续数组元素(Light结构体)要求16字节对齐,因此需填充12字节,使数组起始地址为16字节的倍数,这部分总占用16字节。light[]数组:10个Light元素,每个48字节,总占用10 * 48 = 480字节。
LocalLights缓冲区总尺寸:496字节(16 + 480)。
三、OpenGL函数参数取值(当data_of_array含10个元素时)
针对给出的函数调用:
glBufferData(GL_SHADER_STORAGE_BUFFER, size, data, GL_DYNAMIC_COPY); glBufferSubData(GL_SHADER_STORAGE_BUFFER, offset1, activeLightCountSize, data_of_count); glBufferSubData(GL_SHADER_STORAGE_BUFFER, offset2, totalLightStructSize, data_of_array);
各参数取值:
size:LocalLights总尺寸,即496字节。activeLightCountSize:uint类型的大小,4字节。offset1:activeLightCount的起始偏移,0字节。offset2:light数组的起始偏移,16字节(activeLightCount+填充后的地址)。totalLightStructSize:10个Light的总大小,480字节。
内容的提问来源于stack exchange,提问作者PpuRal
相关产品推荐
相关产品推荐

