如何将大小变化结构的数组传递给 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
代表一个特定的对象。 uvec2
的 x
分量是其顶点数据开始的 vertices
的偏移量。而y
是要读取的顶点数,从x
开始。
因此 vertices[objects[10].x]
是索引为 10 的对象数据的第一个顶点。
顺便说一句:
if this was C++ I would have done an array of vectors
如果这是 C++,我或多或少会像对 GLSL 一样对其进行编码:将所有顶点数据存储在一个数组中,并让每个对象引用该数组的连续切片。它比 vector
数组的访问效率更高,并且需要的分配少得多。
为了向我的应用程序添加动态照明,我想我可以将每个阴影投射对象表示为一组浮点数(每 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
代表一个特定的对象。 uvec2
的 x
分量是其顶点数据开始的 vertices
的偏移量。而y
是要读取的顶点数,从x
开始。
因此 vertices[objects[10].x]
是索引为 10 的对象数据的第一个顶点。
顺便说一句:
if this was C++ I would have done an array of vectors
如果这是 C++,我或多或少会像对 GLSL 一样对其进行编码:将所有顶点数据存储在一个数组中,并让每个对象引用该数组的连续切片。它比 vector
数组的访问效率更高,并且需要的分配少得多。