【发布时间】: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