我需要一种将数组传递给每个顶点包含多个值的顶点着色器的方法。我有这个:
- 一组 3d 点
- 每个点的一组 3d 法线
- 一组面(所有三角形)
- 每个顶点的所有邻域法线的一个数组。如果顶点 i 有 4 个邻居,则该数组具有顶点的 4 个 3d 法线(4 个邻居中的每一个的法线)。为简单起见,我创建了这个数组,就好像所有顶点都具有相同数量的邻居(模型中的最大值,下一个示例中为 4)。
所以,结构如下:
- 点数组 = v0 v1 v2 v3 v4 ...
- 法线数组 = n0 n1 n2 n3 n4 ...
- 面数组 = [0 1 2] [0 3 1] [0 4 3] ...
- 邻域法线数组 = [n1 n2 n3 n4] [n0 n2 n3 0] [n0 n1 0 0] [n0 n1 n4 0] [n0 n4 0 0] [n0 n3 0 0] ...
在示例中,最大邻域为 4,因此对于那些没有 4 个邻居的人,我使用 0 向量(0.0、0.0、0.0)填充所有正常数据。在一般情况下,每个顶点有超过 4 个邻居。在当前模型中,我有一些具有 14 个邻居的顶点,因此每个顶点需要 14 个法线或 42 个浮点数)。
在 VS 的标题中,我有:
layout (location = 0) in vec3 in_Position;
layout (location = 1) in vec3 in_Normal;
layout (location = 2) in XXX in_NeighborsNormals
但我不知道在 XXX 中使用什么来告诉着色器数据不是 vec3、vec4、mat4 等,而是(编译时已知大小)vec3 的数组。
编辑:也许使用 VAO 不是通往 NeighborsNormals 的方法。我愿意接受建议,但我需要知道当前顶点的特定索引才能访问正确的值。
这样做的目的是计算顶点周围区域的曲率,以便使用镶嵌着色器进行镶嵌。特别是,我希望复制这项工作: http: //perso.telecom-paristech.fr/~boubek/papers/VDTess/
我正在使用 C++ 和 OpenGL 4.0,但我可以升级到 OpenGL 4.3。我来自 OpenGL 2.0 的中级知识,但 GLSL(旧的或现代的)对我来说是新的(大约几个月)。
提前致谢。