有人愿意解释一下之间的区别吗顶点缓冲区, a 顶点数组, a 顶点缓冲区对象, and a 顶点数组对象?我什至不确定这些是否都是代表不同事物的术语,但我已经看到它们都出现在 OpenGL 规范中。
我知道一个顶点缓冲区只包含顶点而没有其他内容,一旦绑定,一旦我设置了顶点指针,我就可以使用 DrawArrays 来绘制它。我已经这样做过很多次了。
我正在使用我认为是 VertexArray 的东西,它存储设置的任何顶点缓冲区的状态以及任何顶点指针。绑定 VertexArray 会自动绑定顶点缓冲区并设置顶点指针。我也(大部分)成功地使用了这个。
但什么是顶点缓冲区对象, and a 顶点数组对象?他们更好吗? VertexArray 不能提供我需要的一切吗?
顶点数组只是程序中(在地址空间内)的一些数据,您可以通过提供指向它的指针来告诉 OpenGL。
虽然比单独指定每个顶点更有效,但它们仍然存在性能问题。 GL 必须在调用 DrawElements(或类似函数)时进行复制,因为这是唯一可以确定数据有效的时间(毕竟,没有什么可以阻止您立即覆盖数据)。这意味着并行性存在重大障碍,因此存在性能问题。
顶点缓冲区对象(“顶点缓冲区”)是您不拥有的原始数据块,即它们不在您的地址空间中。您可以使用 Copy(Sub)Data 将数据复制到缓冲区对象中,也可以将其临时映射到地址空间。一旦取消映射缓冲区,它就不再属于您。巨大的优势在于,现在 GL 可以决定如何处理它以及何时上传它。它知道数据将是有效的,因为您无法访问它。这使得 CPU/GPU 并行性变得更加容易。
顶点数组 abjects 有点用词不当。其中没有顶点或数组。它们只是一种“状态描述块”,封装了一个或多个顶点缓冲区对象的绑定(包括任何 VertexAttribPointer 调用)。因此,它们既是一个方便的函数,而且效率更高(函数调用更少),但并不是绝对必要的。您也可以手动完成 VAO 所做的任何事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)