我从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个数组。结构中的字段只是指向数组的指针,它看起来或多或少像这样:
但是我的期望是SSBO数据需要如下所示才能传递给着色器:
因此我的期望是,如果一个人试图天真地将CPP纹理上传到SSBO,我们将得到一个错误,因为我们没有上传所有数据,只是整数和2个指针后跟很多内存不太可能是我们想要的数据(假设没有发生分段错误)。
这个解释是否正确?或者OpenGL是否有办法识别指针并将其数据适当地加载到着色器中?
如果我完全弄错了,请解释在这些情况下如何实际加载SSBO。
答案 0 :(得分:1)
换句话说,在CPP方面,这个数据结构占据了三个不同的部分,即struct和2个数组。
不,它没有。数组和指针不是同一个东西。 sizeof(int[20])
相当于sizeof(int) * 20
。而sizeof(int*)
不等同于sizeof(int[20])
或sizeof(int) * 20
。
数据结构的数组成员就像其他任何成员子目标一样在原位进行存储。