将任意数量值的顶点数组传递给GLSL Vertex Shader

时间:2013-11-01 22:58:29

标签: c++ opengl glsl vertex-buffer vertex-array-object

我需要一种方法将数组传递给Vertex Shader,其中包含每个顶点的多个值。 我有这个:

  • 一个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,所以我用0向量(0.0,0.0,0.0)填充所有正常数据,用于那些没有4个邻居的人。在一般情况下,每个顶点我有超过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(旧的或现代的)对我来说是新的(大约几个月)。

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

在Opengl Part中:

    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,无论您想要什么。