为了在我的应用程序中添加动态照明,我想我可以将每个阴影投射对象表示为一个浮点数组(每 3 个浮点数是一个向量,因此每 9 个浮点数是一个三角形)。因此,为了投射所有可能的阴影,我需要这些数组的数组(如果这是 C++,我会做一个向量数组)。
有没有办法通过 SSBO 或制服在 glsl 着色器中构建类似的东西?
如果没有,我怎么能传递这些信息。这里的问题是我不知道每个着色对象的三角形数量有多大,所以我无法确定一个恒定大小的结构来制作我的实体对象数组。
你同时在思考太高级和太低级。你说你需要一堆数组,但你不需要。您需要的是一种获取场景中特定对象的顶点数据的方法。这根本不必编码为“这些数组的数组”。
相反,将其编码为单个大量顶点数据数组。每个对象都有索引,用于指定顶点数据在此数组中的位置。
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
开始。y
x
vertices[objects[10].x]
索引为 10 的对象的数据的第一个顶点也是如此。
顺便说一句:
如果这是 C++,我会做一个向量数组
如果这是 C++,我会或多或少像 GLSL 那样对其进行编码:将所有顶点数据存储在单个数组中,并让每个对象引用该数组的连续切片。访问它比数组更有效vector
,并且需要更少的分配。