如何将大小变化结构的数组传递给 glsl 着色器

How to pass an array of size changing structures into a glsl shader

为了向我的应用程序添加动态照明,我想我可以将每个阴影投射对象表示为一组浮点数(每 3 个浮点数是一个向量,因此每 9 个浮点数是一个三角形)。因此,为了投射所有可能的阴影,我需要这些数组的数组(如果这是 C++,我会做一个向量数组)。

有没有办法通过 SSBO 或制服在 glsl 着色器中构建类似的东西?

如果没有,我怎么能传递这些信息。这里的问题是我不知道每个着色对象的三角形数量有多大,所以我无法确定一个恒定大小的结构来制作我的实体对象数组。

您同时在考虑太高层次和太低层次。你说你需要一堆数组,但你不需要。您需要的是一种获取场景中特定对象的顶点数据的方法。这根本不必编码为 "an array of these arrays"。

相反,将其编码为单个大量顶点数据数组。每个对象都有指定顶点数据在此数组中的位置的索引。

layout(std430) buffer obj_data
{
  uvec2 objects[];
};

layout(std430) buffer vertex_data
{
  vec4 vertices[]; //NEVER use `vec3`s in storage blocks
};

objects是一个数组,其中每个uvec2代表一个特定的对象。 uvec2x 分量是其顶点数据开始的 vertices 的偏移量。而y是要读取的顶点数,从x开始。

因此 vertices[objects[10].x] 是索引为 10 的对象数据的第一个顶点。

顺便说一句:

if this was C++ I would have done an array of vectors

如果这是 C++,我或多或少会像对 GLSL 一样对其进行编码:将所有顶点数据存储在一个数组中,并让每个对象引用该数组的连续切片。它比 vector 数组的访问效率更高,并且需要的分配少得多。