为啥我的索引缓冲区没有与 glDrawArraysInstanced (OpenGLES 3.0) 一起使用

Posted

技术标签:

【中文标题】为啥我的索引缓冲区没有与 glDrawArraysInstanced (OpenGLES 3.0) 一起使用【英文标题】:Why is my index buffer not being used with glDrawArraysInstanced (OpenGLES 3.0)为什么我的索引缓冲区没有与 glDrawArraysInstanced (OpenGLES 3.0) 一起使用 【发布时间】:2014-01-28 17:09:14 【问题描述】:

我找不到有关此功能的更多信息。我有2个VBO。第一个包含绑定到 GL_ARRAY_BUFFER 的位置、法线和颜色信息。第二个是绑定到 GL_ELEMENT_ARRAY_BUFFER 的索引缓冲区。在非实例化绘图调用中,我将正确的模型绘制到屏幕上,但是当我使用实例化渲染进行相同调用时,我会丢失每个实例中的一半图元。我正在做一个用 gl_InstanceID 索引的翻译数据填充的统一数组。翻译工作正常,但一半的原语没有出现。我已经排除了剔除的问题。我认为由于需要传递的索引数量,因此绘图调用将根据传入的计数值查找 GL_ELEMENT_ARRAY_BUFFER 和步幅。有人可以向我解释一下幕后发生了什么吗?

【问题讨论】:

您使用的是哪个 ES 3.0 实现? 我改用 glDrawElementsInstanced 作为棘轮怪胎的建议,现在它工作正常。谢谢! @Cristiano 您可以通过单击已解决问题上的复选标记来表明您的问题已得到回答 【参考方案1】:

因为glDrawArraysInstanced 不使用元素缓冲区,但glDrawElementsInstanced 使用

【讨论】:

感谢您的快速回复。硬件如何知道如何在没有索引缓冲区的情况下绘制人脸? @Cristiano,它按顺序使用数据——每个顶点数据位置对应一个索引。 @Cristiano 换句话说,它假定索引缓冲区是[0,1,2,3,4,...]

以上是关于为啥我的索引缓冲区没有与 glDrawArraysInstanced (OpenGLES 3.0) 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 glDrawArrays 没有绘制我存储的点?

glDrawElements中的OpenGL SegFault

PyOpenGL - 最小 glDrawArrays 示例

Opengl_8_索引绘制

尝试从帧缓冲区传递纹理会导致 L_INVALID_OPERATION:glDrawArrays:绘制的源纹理和目标纹理相同

OpenGL ES之VBOEBO与VAO的说明和使用