C++ 元素中的第四个参数是什么?

C++ 元素中的第四个参数是什么?,c++,opengl,C++,Opengl,我对gldrawerelements()感到困惑。我遵循的是一个教程,该教程说,glpaurements()的第四个参数是“GL\u元素数组缓冲区内的偏移量”。但如果我将0作为偏移量传递,则出现错误“Access voilation:尝试读取0x0000” 因此,我深入研究了这个问题,发现OpenGL文档提供了第四个参数的两种不同定义: 第一: 索引:指定索引中的字节偏移量(转换为指针类型) 绑定到GL\u元素\u数组\u缓冲区的缓冲区​ 开始阅读索引 从 (可在此处找到:) 第二: 索引:指定

我对
gldrawerelements()
感到困惑。我遵循的是一个教程,该教程说,
glpaurements()
的第四个参数是“GL\u元素数组缓冲区内的偏移量”。但如果我将0作为偏移量传递,则出现错误“Access voilation:尝试读取0x0000”

因此,我深入研究了这个问题,发现OpenGL文档提供了第四个参数的两种不同定义:

第一:

索引:指定索引中的字节偏移量(转换为指针类型) 绑定到GL\u元素\u数组\u缓冲区的缓冲区​ 开始阅读索引 从

(可在此处找到:)

第二:

索引:指定指向存储索引的位置的指针

(可在此处找到: 这里:)

哪一个是正确的,如何正确使用


编辑:这是我的代码:

该参数的解释取决于内部数组是否已绑定到GL状态机中。如果这样一个数组被绑定,它就是一个偏移量。如果没有绑定这样的数组,那么它就是指向内存的指针

使用内部数组的性能更高,因此最近的文档(尤其是Wiki)强烈倾向于这种用法。然而,有一个漫长的歌曲和舞蹈,以建立他们

绑定或取消绑定内部数组的函数是glBindVertexArray。检查这些相关功能的文档:

  • glGenVertexArrays
  • glBufferData
(这是一个不完整的列表。我必须运行,所以以后必须进行编辑。)

如果您使用

指数​ 定义索引缓冲区对象的偏移量(绑定到GL\U元素\U数组\U缓冲区​, 存储在VAO中)以开始读取数据


这意味着,您需要创建VAO,绑定到它,然后使用
glDrainElements()
进行渲染opengl.org/wiki上的任何内容都可能是正确的。我可以从工作项目中告诉你们,它的定义如下:

Specifies a byte offset (cast to a pointer type) into the buffer bound to
GL_ELEMENT_ARRAY_BUFFER​ to start reading indices from.
只需将一些整数转换为GLvoid*就可以了。至少对于现代的可编程管道,我不知道固定管道(你也不应该使用它!)

如果您使用的是现代管道,没有进一步的信息,我敢打赌实际函数没有正确加载。GLEW没有正确初始化,或者您正在手动尝试在win32上使用GetProcAddress(因为glDrawElements是自1.1以来的核心,并且在win32上不应使用GetProcAddress加载1.0/1.1)


请注意,您应该像其他人所说的那样将元素缓冲区绑定到绑定点。虽然在实践中,你可以不必约束VAO而侥幸逃脱。我在NVidia、AMD甚至Intel上都做过。但在生产中,您应该使用VAOs。

两者都是正确的。这两种情况涉及如何将索引缓冲区上载到GL硬件以及如何使用它进行绘制。这些措施如下:

(1) 不使用VBO(顶点缓冲区对象):

在本例中,该参数表示指向索引数组的指针。每次调用
glpaurements
时,缓冲区都会上载到GL-HW

(2) 使用VBO:


对于这种情况,请参见索引的定义为“指定绑定到GL\u元素\u数组\u缓冲区的缓冲区中的字节偏移量(转换为指针类型)”​ 从“开始读取索引”。这意味着数据已经使用
glBufferData
单独上传,索引仅用作偏移量。每次调用
glpaurements
时,缓冲区不会上载,但只有偏移量可以根据需要更改。这使它更高效,尤其是在涉及大量顶点的情况下。

我在Windows机器上使用OpenGL 3.1.0和GLEW 1.10.0。我建议打印函数指针(从而检查它们是否为0x0000),并查看GLEW是否正确初始化。如果两者都签出,则一定是其他原因,要么是代码中我们在这里看不到的其他原因,要么是您没有绑定元素缓冲区,要么是您正在执行其他与巫毒教相关的奇怪操作。还有一件事:如果我使用
glDrawArrays()
,那么它可以正常工作。这意味着GLEW初始化良好。对吗?可能是,可能不是,我不知道GLEW如何在内部处理错误。你应该使用官方的方式来检查初始化+打印出相关的函数指针来检查NULL不会有什么坏处。。。但我得到了“访问读数0x00”。这意味着我的VBO设置不正确?我发现:除了VBO(顶点缓冲区对象)和EBO(元素数组缓冲区)之外,还需要创建VAO(顶点数组对象)才能正常工作。是的,你是对的:根据上下文,这两个定义都是正确的+1讨论效率时,VAO是关键点!我在创建VAO,但在创建EBO之后。为了进一步向其他人澄清:您需要在EBO和VBO之前创建VAO,并将这些缓冲区绑定到VAO以正确工作。@cashifilya可以,在这种情况下,您可能需要进行调查,您不必在技术上进行任何操作。这取决于您的OpenGL版本和上下文。在兼容性配置文件中,可以使用客户端内存而不是缓冲区对象。同样,在这种情况下,您根本不需要VAO。当没有绑定元素数组缓冲区时,它告诉GL从作为第四个参数传递的地址读取内存;当一个元素被绑定时,它会告诉GL在绑定元素数组缓冲区定义的内存中使用偏移量。