Answers:
顶点数组对象的命名有些不幸。在您的应用程序中/周围/周围出现(曾经出现过)三种不同的事物,并且它们的名称(从历史上来看)是不同的,名称中带有“ array”或“ buffer”(当然,还有framebuffer对象,但我会忽略这一点)。
顶点数组对象(VAO)是包含一个或多个顶点缓冲区对象的对象,旨在存储完整渲染对象的信息。
(从khronos中拉出)
每个缓冲区倾向于构成一个顶点数组(对象)的一个属性。VAO可以包含许多顶点属性(例如,位置,颜色,UV)。每个缓冲区可能都保存在自己的缓冲区中,其中buffer表示一系列无格式的连续字节,并且需要为CPU端OpenGL调用和GPU端着色器工作显式指定每个缓冲区元素的大小(类型)。
那是一种方式。其他可行的方法是:
下图说明了后两种情况。
底线:如果在OpenGL中使用“顶点数组”一词时没有限定,则可以假设它表示VAO,这在OpenGL上下文中(具体而言)与缓冲区确实是非常不同的东西。
编辑您的评论:GL_ARRAY_BUFFER
如上所述,表示打算将该缓冲区对象用于顶点属性数据。这是因为缓冲区不仅仅用于顶点属性。但是,由于这是最常见的用例,而您正在询问VAO,因此我将不再赘述。但是,这里列出了可以设置的其他类型的缓冲区。
struct
类型或类型。每个缓冲区的数据可以交错或完全统一。您可以对其进行索引,就像在CPU上使用传统的C数组一样。数组对象(使用此正确术语或使自己迷惑!)...(下续)
该术语植根于OpenGL的历史。需要记住的重要一点是,对于此处相关的大多数GL版本,OpenGL都是逐步进行的,并且是通过向现有API中添加新功能而不是更改API来实现的。
OpenGL的第一个版本没有这些对象类型。绘制是通过发出多个glBegin / glEnd调用来实现的,该模型的一个问题是就函数调用开销而言,它的效率很低。
OpenGL 1.1采取了第一步,通过引入顶点数组来解决此问题。现在,您可以直接从C / C ++数组中获取其数据,而不是直接指定顶点数据-从而命名。因此,顶点数组就是这样-顶点数组和指定它们所需的GL状态。
GL 1.5的下一个重大改进是将顶点阵列数据存储在GPU内存中,而不是系统(“客户端”)内存中。GL 1.1顶点数组规范的一个弱点是,每次您要使用它时,都必须将整套顶点数据传输到GPU。如果已经在GPU上,则可以避免这种转移,并获得潜在的性能提升。
因此,创建了一种新型的GL对象,以允许将这些数据存储在GPU上。就像纹理对象用于存储纹理数据一样,顶点缓冲区对象也存储顶点数据。实际上,这只是更普通的缓冲区对象类型的一种特殊情况,它可以存储非特定数据。
使用顶点缓冲对象的API背负在已经存在的顶点数组API上,这就是为什么您会看到诸如将字节偏移量转换为指针之类的怪异事物的原因。因此,现在我们有了一个只存储状态的顶点数组API,数据是从缓冲区对象而不是内存中数组中获取的。
这使我们几乎走到了故事的尽头。指定顶点数组状态时,所得的API相当冗长,因此,另一种优化途径是创建一个新的对象类型,将所有这些状态收集在一起,在单个API调用中允许多个顶点数组状态更改,并允许GPU由于能够提前知道将要使用的状态,因此有可能执行优化。
输入顶点数组对象,该对象将所有这些元素收集在一起。
因此,总而言之,顶点数组的开始是作为状态和数据(存储在数组中)的集合,以便进行绘制。甲顶点缓冲器替换为GL对象类型的内存阵列存储,离开顶点数组只是被状态。甲顶点数组对象仅仅是该状态下的容器对象,允许其更容易地改变,并且以更少的API调用。
我已经有一段时间没有使用OpenGL了,所以我可能只说对了一半。一般而言:缓冲区存储未格式化的内存数组。数组是连续内存的总称。
缓冲区需要绑定到上下文,而数组只是数据数组。如果我没记错的话,缓冲区中的数据将被复制到图形卡上(因此进行绑定)。
希望这个对你有帮助
char* buffer = socketRead();
(伪代码)一样简单。另一方面,日志贯穿整个应用程序生命周期。因此,您可以在任何地方创建一个数组并开始读取套接字,每当获取数据时,便将该块写入数组,从而为您收到的所有数据提供一个整齐的列表。