1

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

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

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

4

1 回答 1

2

你同时在思考太高级和太低级。你说你需要一堆数组,但你不需要。您需要的是一种获取场景中特定对象的顶点数据的方法。这根本不必编码为“这些数组的数组”。

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

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

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

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

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

顺便说一句:

如果这是 C++,我会做一个向量数组

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

于 2018-01-15T01:30:02.650 回答