将带有数组的结构加载到 SSBO 时会发生什么?

What happens when loading a struct with an array to an SSBO?

我从 Khronos wiki 中获取了以下 SSBO 声明:

struct ssbo_data_t
{
    int foo;
    float bar[42];
    float baz[MY_SIZE];
} ssbo_data;

这个数据结构有两个数组,一个是固定长度的,一个是可变长度的。

CPP 端的相同声明是相同的,但为了准确说明内存的实际结构,我将稍微不同地声明它:

struct ssbo_data_t
{
    int foo;
    float bar*;
    float baz*;
} ssbo_data;

换句话说,在CPP端这个数据结构占据了三个不同的部分,struct和2 arrays。结构中的字段只是指向数组的指针,看起来或多或少像这样:

但是我的期望是 SSBO 数据需要如下所示才能传递给着色器:

因此我预计,如果有人试图天真地将 CPP 纹理上传到 SSBO,我们会得到一个错误,因为我们没有上传所有数据,而只是上传整数和 2 个指针,后跟一个大量内存不太可能是我们想要的数据(假设没有发生分段错误)。

这个解释正确吗?或者 OpenGL 是否有办法识别指针并将其数据适当地加载到着色器中?

如果我完全弄错了,请解释在这些情况下 SSBO 是如何实际加载的。

In other words, in the CPP side this data structure occupies three different sections, the struct and the 2 arrays.

不,不是。数组和指针不是一回事sizeof(int[20]) 等同于 sizeof(int) * 20。而 sizeof(int*) 不等同于 sizeof(int[20])sizeof(int) * 20

数据结构的数组成员就地占用存储空间,就像任何其他成员子对象一样。