gpt4 book ai didi

c++ - VBO 的顶点数组 -OpenGL

转载 作者:行者123 更新时间:2023-11-28 03:00:31 25 4
gpt4 key购买 nike

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

    glm::vec3* Vertices;

如何将其元素传递给 glVertexAttribPointer。唯一的方法只是一维数组吗?例如;我可以使用类似的东西吗:

    float* Vertices[3];

最佳答案

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

您没有将任何东西传递给 glVertexAttribPointer。在使用 glBindBuffer 绑定(bind)缓冲区后,您必须先使用 glBufferData 将其写入 GRAM。 glVertexAttribPointer 将仅描述在此绑定(bind)缓冲区中的何处可以找到数据。这一点表明您几乎可以将任何想要的数据传递给 GRAM。如果你有 vec3 数组(我假设 vec3 只包含 float 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); 

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

glVertexPointer(3, GL_FLOAT, 0, 0)
  • 每个顶点有 3 个坐标(大小)
  • 它们是 float (GL_FLOAT,类型)
  • 缓冲区 sizeof(float) * 3 中的整个数据集的长度为 12 字节,因为您在这里只使用一个指针,所以当您传递 0 (elements * typesize) (步幅)
  • 它们从缓冲区的开头开始(0,offset)

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

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

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

关于c++ - VBO 的顶点数组 -OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20961908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com