2014-09-04 47 views
0

假设我正在渲染一个3d GL_TRIANGLE。该对象需要3个顶点来定义它:A,B,C。我将这些数据放入缓冲区,并通过glVertexAttribPointer将其绑定到着色器。OpenGL glVertexAttribPointer正常

现在我想在正常情况下传递给着色器。对于每个三角形,应该有1个法线向量,但如果我尝试通过glVertexAttribPointer传入,我需要为点A,B,C定义相同的法线3次。 是否有可能在glVertexAttribPointer中每3个其他顶点传入一个顶点以避免这种情况?

或者它是一个好主意,通过它的所有顶点?

+1

这并不容易。如果不同属性的数组不匹配,则需要为每个属性指定单独的索引数组以将属性分配给顶点。这不支持。我在这里回答了类似的问题,详细阐述了这一点:http://stackoverflow.com/questions/25349620/use-one-gl-element-array-buffer-to-reference-each-attribute-from-0/25352461#25352461 。 – 2014-09-04 04:30:41

回答

2

现在我想正常传递给着色器。对于每个三角形,应该有1个法线向量

不,有3个法线。每个顶点一个。

是否有可能在glVertexAttribPointer中每隔3个顶点传入1个顶点以避免这种情况?

不,因为顶点属性属于一起,不能分开。

或者它是一个好主意,通过它的所有顶点?

当然。让每个人都变得更加轻松。

+0

好的。也是最后一个小相关问题。我试图使用一个元素缓冲区的高度图(定义所有点一次,并绘制它们与GL_ELEMENT_ARRAY)。然而,似乎用这种方法没有计算和将法线放入顶点缓冲区的空间。我将如何能够存储和通过这样一个结构的正常? – sgtHale 2014-09-04 19:40:12

+1

@sgtHale:无论如何你都不想拥​​有脸部法线的高度图。你需要每个顶点的法线,其中每个顶点的法线是顶点所在面的法线的平均值。 – datenwolf 2014-09-04 21:15:57

+0

@sgtHale:请注意,如果你想要一个平坦的阴影效果(这导致了一个多面的外观),你可以指定,某些顶点属性不应该在脸上插值;在该集合中,只考虑为面部的第一个顶点指定的值。如果你仔细想想,顶点和面之间有一个严格的偏移量,这意味着你可以简单地将每个面的法向赋值给顶点,而事情按预期工作。 – datenwolf 2014-09-04 21:24:09