【问题标题】:What happens when loading a struct with an array to an SSBO?将带有数组的结构加载到 SSBO 时会发生什么?
【发布时间】:2018-11-05 10:54:47
【问题描述】:

我已从 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 端,这个数据结构占据了三个不同的部分,结构体和 2 个数组。结构中的字段只是指向数组的指针,看起来或多或少像这样:

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

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

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

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

【问题讨论】:

  • "我从 Khronos wiki 获取了以下 SSBO 声明:" 这是 C++ 声明,不是 GLSL 声明。 GLSL 就在它上面。
  • 我需要一个用于 C++ 结构的不同大小的数组,我相信这会使内存不连续。我需要连续的内存才能正常工作。

标签: c++ opengl glsl buffer gpu


【解决方案1】:

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

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

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

【讨论】:

  • 我不明白,对于可变大小的数组,你不使用malloc分配它的内存吗? (我有一段时间没有使用纯 C 语言所以我忘记了)
  • 在 C 中重新分配两个数组中的任何一个的大小也是有效的,不是吗?
  • 我相信我的问题问得不好,并希望将其删除。但是,您已尽力回答,因此我请求您的许可。如果你拒绝,我会接受你的回答。
猜你喜欢
  • 2012-11-09
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
相关资源
最近更新 更多