我有一个包含坐标的数组。它看起来像:
glm::vec3* Vertices;
如何将其元素传递给glVertexAttribPointer。只是一维数组的唯一方法吗?例如;我能用这样的东西:
float* Vertices[3];
答案 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
)type
)stride
)为简单起见,我在这里使用glVertexPointer。
您可以在LWJGL Wiki中找到关于VBO的非常好的教程
http://www.lwjgl.org/wiki/index.php?title=Using_Vertex_Buffer_Objects_%28VBO%29