用于VBO-OpenGL的顶点阵列

Vertex Array for VBO -OpenGL

本文关键字:阵列 顶点 VBO-OpenGL 用于      更新时间:2023-10-16

我有一个包含坐标的数组。它看起来像:

glm::vec3* Vertices;

如何将其元素传递给glVertexAttribPointer。唯一的方法就是一维数组吗?例如我能用这样的东西吗:

float* Vertices[3];

在阅读我的答案之前:显然,我的答案只是部分正确,您可以使用glVertexAttribPointer,而无需手动写入GRAM,而是使用客户端内存,但最好使用VBO,而不是使用这种方法。

您不会将某些内容传递给glVertexAttribPointer。在使用glBindBuffer绑定缓冲区之后,您必须首先使用glBufferData将其写入GRAM。CCD_ 4将仅描述在该绑定缓冲区中将在哪里找到数据。这一点表明,您可以将几乎任何想要的数据传递给GRAM。如果你有vec3的数组(我假设vec3只包含浮点x、y和z),这个数组的内存看起来像x1, y1, z1, x2, y2, z2, x3, y3, z3等等。如果它被写入你的GRAM,你必须指定这个数据,这样你的GPU才能知道该怎么做。示例:

glBindBuffer(GL_ARRAY_BUFFER, bufferID); 

bufferID必须在(glGenBuffers)之前分配。

glBufferData(GL_ARRAY_BUFFER, 36, vertices, GL_STATIC_DRAW); 

写入GL_ARRAY_buffer中绑定的缓冲区(使用glBindBuffer)。写入36个字节(浮点=4个字节,1个只有位置的顶点=3个浮点,1个三角形=3个顶点,对于1个三角形总计36个字节)GL_STATIC_DRAW表示我们将写入一次,然后只绘制它。

glVertexPointer(3, GL_FLOAT, 0, 0)
  • 每个顶点有3个坐标(size)
  • 它们是浮动(GL_FLOAT、type)
  • 缓冲区大小为(float)*3的整个数据集有12个字节的长度,因为这里只使用一个指针,所以当您传递0(elements*typesize)(stride)时,它可以为自己计算步长
  • 它们从缓冲区(0,offset)的开头开始

为了简单起见,我在这里使用了glVertexPointer。

你可以在LWJGL Wiki 中找到一个非常好的VBO教程

http://www.lwjgl.org/wiki/index.php?title=Using_Vertex_Buffer_Objects_%28VBO%29