在阅读我的答案之前:显然我的答案只是部分正确,您可以使用 glVertexAttribPointer 而无需手动写入 GRAM 而是使用客户端内存,但仍然最好使用 VBO 而不是使用这种方法。
你没有把东西传递给glVertexAttribPointer。在将缓冲区与glBindBuffer 绑定后,您必须首先使用glBufferData 将其写入GRAM。 glVertexAttribPointer 将仅描述在此绑定缓冲区中的何处可以找到数据。这一点表明您可以将几乎任何您希望的数据传递给 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)
- 缓冲区 sizeof(float) * 3 中的整个数据集的长度为 12 字节,并且因为您在这里只使用单个指针,所以当您传递 0(元素 * 类型大小)时,它可以为自己计算步幅 (@987654333 @)
- 它们从缓冲区的开头开始 (0,
offset)
为了简单起见,我在这里使用了 glVertexPointer。
您可以在 LWJGL Wiki 中找到关于 VBO 的非常好的教程
http://www.lwjgl.org/wiki/index.php?title=Using_Vertex_Buffer_Objects_%28VBO%29