gpt4 book ai didi

opengl - OpenGL 是如何知道如何通过 glDrawElements() 使用普通数据的?

转载 作者:行者123 更新时间:2023-12-05 04:15:38 28 4
gpt4 key购买 nike

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

我有:

vertices = {...};
normals = {...};
vertex_indices = {...};
normal_indices = {...};

(1) 我设置我的 VBO

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);

然后在我的渲染方法中调用glDrawElements

glDrawElements(GL_TRIANGLES, (int)vertex_indices.size(), GL_UNSIGNED_INT, 0);

我没有在任何地方传递正常索引,但一切似乎都运行良好。

我认为我没有正确理解 glDrawElements。在没有正常指数的情况下,照明是如何工作的? glDrawElements 应该只获取顶点索引吗?

最佳答案

I don't think I understand glDrawElements correctly. How did the lighting work without the normal indices? was glDrawElements suppose to only get the vertex indices?

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

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

因此,glDrawElements 仅使用一个索引数组,这是同时指向所有启用的顶点属性数组 的索引。您的 normal_indices 数组根本没有被使用。如果它仍然按预期工作,那么您的正常数据恰好以正确的方式组织。

关于opengl - OpenGL 是如何知道如何通过 glDrawElements() 使用普通数据的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31642410/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com