2

在加载网格和纹理以及模型类中的其他内容时,我一直想知道这一点,您保留什么?我想一旦顶点通过 glBufferData() 传递,我就不再需要它们了,因为对 glDrawArrays() 的调用取决于最后一个 glBindBuffer() 这是我的模型类在调用 loadModel() 方法后保留的所有内容。

GLuint vboID;//for... something
GLuint vaoID;//for  glBindVertexArray(vaoID);
GLuint textureID;//for glBindTexture(GL_TEXTRUE2D, textureID);
GLuint vboElementCount;//for glDrawArrays(GL_TRIANGLES,0,vboElementCount);

据我所知,这就是渲染模型所需的全部内容。除此之外,我还应该为一个简单的模型保留什么?

编辑:在有人提到位置旋转比例和你有什么之前,我有一个包含这些矩阵的 ModelInstance 类,我将它传递给 Model 对象的指针,这样我就可以拥有同一个 Model 的多个实例。

4

1 回答 1

1

我一直

  • VBO ids,所以当我不再需要它们时,我可以删除它们。
  • VAO id,所以我可以在绘制之前绑定并最终删除。
  • 要传递到的索引数glDrawElements()
  • 所有必需纹理的 ID。
  • 材料和变换属性(一般为制服)。

只要网格是静态的,它就可以正常工作。只要您想在 CPU 上操作网格,例如平滑或分割它们,您就必须在主内存中保留一份副本。也许您还想保留一个低分辨率的占位符,例如用于更专业的渲染技术,如遮挡剔除。但同样,这是一个特例;您的问题列出了基本渲染所需的一切

注意:您应该考虑切换到glDrawElements(). 它将减少您必须存储和传输的顶点数据量。

于 2013-09-11T08:04:01.863 回答