0

我需要一种将数组传递给每个顶点包含多个值的顶点着色器的方法。我有这个:

  • 一组 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(旧的或现代的)对我来说是新的(大约几个月)。

提前致谢。

4

1 回答 1

2

我知道你有一些关于你的对象的数据,你想在你的顶点着色器中处理它。您可以通过将数组写入纹理来将数组传输到顶点着色器。之后将其导入顶点着色器并使用它。

在 Opengl 部分:

    GLuint myarray // Load your texture to this variable
glEnable(GL_TEXTURE_2D);  
glUniform1i(glGetUniformLocation(YOURSHADERID, "MYARRAY"), 0);  
glBindTexture(GL_TEXTURE_2D, myarray); //you can change the first parameter depends what type of texture you prefer.

在顶点着色器中:

    uniform sampler2D MYARRAY; // you can use sampler1D also if you upload a 1D texture 

之后,您可以从 MYARRAY 访问您的数据。您可以从数据中读取并将它们形成为 vec3 , vec4 任何您想要的。

于 2013-11-01T23:22:43.400 回答