我试图得到一个清晰的概念,当我应该使用索引的OpenGL顶点数组,用gl [Multi] DrawElements等绘制,而当我应该简单地使用连续的顶点数组,用gl [Multi] DrawArrays 。 ( 更新:我收到的答复中的共识是,应该始终使用索引的顶点。) 我已经多次在这个问题上来回讨论,所以我将概述我目前的理解,希望有人能够告诉我,我现在终于或多或less地正确了,或者指出我剩下的误解是在哪里。 具体来说,我有三个结论,粗体。 如果他们错了,请纠正。 一个简单的例子是,如果我的几何形状由网格组成,形成曲面。 在这种情况下,网格中间的顶点对于使用该顶点的每个三angular形将具有相同的属性(位置,法线,颜色,纹理坐标等)。 这使我得出结论: 1.对于接缝较less的几何体,索引arrays是一个很大的胜利。 遵守规则1,除了: 对于非常“块状”的几何graphics,其中每个边代表一个接缝,索引数组的好处就不那么明显了。 以一个简单的立方体为例,虽然每个顶点被用于三个不同的面,我们不能共享它们之间的顶点,因为对于单个顶点,表面法线(以及可能的其他事物,比如颜色和纹理协调)在每张脸上都会有所不同。 因此,我们需要明确地将多余的顶点位置引入到我们的数组中,以便相同的位置可以使用多次不同的法线等。这意味着索引数组的用处不大。 例如渲染立方体的单个面时: 0 1 o—o |\ | | \ | | \| o—o 3 2 (这可以被孤立地考虑,因为这个面和所有相邻面之间的接缝意味着这些顶点之间的接缝都不能在面之间共享) 如果使用GL_TRIANGLE_FAN(或_STRIP)进行渲染,则可以渲染多维数据集的每个面: verts = [v0, v1, v2, v3] colors = [c0, c0, c0, c0] normal = [n0, n0, n0, n0] 添加索引不允许我们简化这一点。 从这我得出结论: […]
我正在关注一些begginer的OpenGL教程,并对这段代码感到困惑: glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); //Bind GL_ARRAY_BUFFER to our handle glEnableVertexAttribArray(0); //? glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); //Information about the array, 3 points for each vertex, using the float type, don't normalize, no stepping, and an offset of 0. I don't know what the first parameter does however, and how does this function know which array […]