OpenGL如何知道如何将普通数据与GLDrawerElements()一起使用?

OpenGL如何知道如何将普通数据与GLDrawerElements()一起使用?,opengl,graphics,Opengl,Graphics,我花了几天时间构建了一个在OpenGL中使用简单照明渲染立方体的工作示例 我有: vertices = {...}; normals = {...}; vertex_indices = {...}; normal_indices = {...}; (1) 我设置了VBOs glBufferSubData(GL_ARRAY_BUFFER, 0, vertSize, &vertices[0]); // vertices glBufferSubData(GL_ARRAY_BUFFER, ve

我花了几天时间构建了一个在OpenGL中使用简单照明渲染立方体的工作示例

我有:

vertices = {...};
normals = {...};
vertex_indices = {...};
normal_indices = {...};
(1) 我设置了VBOs

glBufferSubData(GL_ARRAY_BUFFER, 0, vertSize, &vertices[0]); // vertices
glBufferSubData(GL_ARRAY_BUFFER, vertSize, normSize, &normals[0]); // normals
(2) 我启用顶点指针

glEnableVertexAttribArray(0);
glVertexAttribPointer(0,..)

glEnableVertexAttribArray(1);
glVertexAttribPointer(1,..)
(3) 我还设置了索引缓冲区

 glBufferData(GL_ELEMENT_ARRAY_BUFFER, indcSize, & vertex_indices[0], GL_STATIC_DRAW);
然后在我的渲染方法中调用
glpaurements

glDrawElements(GL_TRIANGLES, (int)vertex_indices.size(), GL_UNSIGNED_INT, 0);
我在任何地方都没有通过正常指数,但一切似乎都很好

我想我对元素的理解不正确。在没有正常指标的情况下,照明是如何工作的?假设元素只得到顶点索引吗

我想我对元素的理解不正确。在没有正常指标的情况下,照明是如何工作的?假设元素只得到顶点索引吗

在OpenGL中,每个属性没有单独的索引。就OpenGL而言,顶点是所有属性的n元组,比如位置、颜色、法向量、tex坐标等等

对于立方体,至少需要24个顶点。只有8个角点位置,但每个角点连接到3个不同的面,每个面具有不同的法线。这意味着,每个角需要3个单独的顶点,它们都位于同一位置,但它们的法线方向不同


因此,
glDraweElements
仅适用于一个索引数组,这是同时对所有启用的顶点属性数组的索引。您的
normal\u索引
数组根本不使用。如果它仍然按预期工作,那么您的正常数据恰好以正确的方式组织

感谢现在对我来说完全有意义,是的,正常指数是有序的,我想这就是它起作用的原因。如果没有订购呢?我怎么才能把它们传给其他人?@没关系:你永远不会传给他们。如果正常数据的顺序与位置数据的顺序不同,则必须对其进行重新排序,使其与位置数据的顺序相同。正如derhass提到的,如果同一位置被多条法线使用,这可能意味着复制位置数据