用于VBO -OpenGL的顶点数组

时间:2014-01-07 00:32:05

标签: c++ opengl vertex-buffer

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

    glm::vec3* Vertices;

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

    float* Vertices[3];

1 个答案:

答案 0 :(得分:2)

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

您没有将某些内容传递给glVertexAttribPointer。在使用glBufferData绑定缓冲区后,您必须首先使用glBindBuffer将其写入GRAM。 glVertexAttribPointer将仅描述在此绑定缓冲区中将找到数据的位置。这里有一点表明您几乎可以将任何数据传递给GRAM。如果你有你的vec3数组(我假设vec3只包含浮点数x,y和z),那么这个数组的内存看起来像x1, y1, z1, x2, y2, z2, x3, y3, z3,依此类推。如果将其写入GRAM,则必须指定此数据,以便GPU知道该怎么做。例如:

glBindBuffer(GL_ARRAY_BUFFER, bufferID); 
必须在(glGenBuffers)之前分配

bufferID。

glBufferData(GL_ARRAY_BUFFER, 36, vertices, GL_STATIC_DRAW); 

写入GL_ARRAY_BUFFER中绑定的缓冲区(使用glBindBuffer)。写36个字节(float = 4bytes,1个顶点,只有position = 3个浮点数,1个三角形= 3个顶点,总共最多36个字节,1个三角形)GL_STATIC_DRAW表示我们将写入一次然后只绘制它。

glVertexPointer(3, GL_FLOAT, 0, 0)
  • 每个顶点(size
  • 有3个坐标
  • 它们是花车(GL_FLOAT,type
  • 缓冲区sizeof(float)* 3中的整个数据集的长度为12个字节,因为在这里只使用单个指针,它可以在传递0时计算自身的步幅(elements * typesize)({{ 1}})
  • 它们从缓冲区的开头(0,stride
  • 开始

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

您可以在LWJGL Wiki中找到关于VBO的非常好的教程

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