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

时间:2018-05-26 04:41:38

标签: c++ opengl glsl buffer gpu

我从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个数组。结构中的字段只是指向数组的指针,它看起来或多或少像这样:

enter image description here

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

enter image description here

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

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

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

1 个答案:

答案 0 :(得分:1)

  

换句话说,在CPP方面,这个数据结构占据了三个不同的部分,即struct和2个数组。

不,它没有。数组和指针不是同一个东西sizeof(int[20])相当于sizeof(int) * 20。而sizeof(int*)不等同于sizeof(int[20])sizeof(int) * 20

数据结构的数组成员就像其他任何成员子目标一样在原位进行存储。