OpenGL有没有办法复制现有的VAO
Posted
技术标签:
【中文标题】OpenGL有没有办法复制现有的VAO【英文标题】:OpenGL is there a way to copy an existing VAO 【发布时间】:2013-09-12 17:39:47 【问题描述】:在我的代码中,我有一个 Mesh 类,它是基本 VAO 和 VBO 功能的包装器。它的构造函数接受一个顶点和索引数组,并有一个 draw() 函数。
我在实例化过程中调用 glGen* 函数,在其析构函数中调用 glDelete* 函数。
显然这会在分配/复制构造过程中留下问题:
Mesh A;
Mesh B( myVerts, myIndices );
A = B;
A.draw(); // this works because the VAO and VBOs of B are still around
A.draw(); // fails because the destructor of B calls glDelete
为了解决这个问题,在赋值和复制构造函数中,我使用 glMapBuffer 重新缓冲 VBO 数据:
Mesh& Mesh::operator = ( const Mesh &otherMesh )
glGenBuffers( 1, &_vertexBufferObject );
otherMesh.bind();
void *data = glMapBuffer( GL_ARRAY_BUFFER, GL_READ_WRITE );
bind();
glBufferData(GL_ARRAY_BUFFER, _numBytes, data, GL_STREAM_DRAW);
otherMesh.bind();
glUnmapBuffer(GL_ARRAY_BUFFER);
有没有办法将 VAO 状态从一个 VAO 复制到另一个。或者我必须重新调用所有 glVertexAttribPointer() 等函数以获得新的 VAO。
【问题讨论】:
【参考方案1】:您使用网格作为实际的可绘制类型有什么原因吗?
通常,网格/三角形汤将是共享资源,您将实例化它们以使用模型/对象进行绘图。当您实例化需要特定网格的模型/对象时,您将增加引用计数并存储指针 - 这就是资源管理 101 的简而言之。
随意称呼他们,我认为您没有正确区分数据的存储位置和呈现数据所需的界面。您不应该为对象的每个实例都需要一个 VAO,并且只有在不再引用顶点数据时才应该删除 VAO/VBO。
【讨论】:
我完全同意,我可以说我在我的个人项目中使用了类似的资源管理设计模式。但是,我正在编写一个较小的 OpenGL 学习库,(同学)将使用它来简化他们对现代 OpenGL 的介绍。我认为将网格隔离为不同的独立对象会更直观。但是现在我想起来了,对他们来说,实现一个简单的 RM 来强调应该如何正确使用 VAO/VBO 可能对他们更有利。谢谢! 我也忘了提到我使用网格来封装以前的即时模式功能。因此,您可以创建一个网格并使用类似的 'begin()、vertex() 和 end(),这是整个网格是不同的独立对象的另一个原因。以上是关于OpenGL有没有办法复制现有的VAO的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将现有的 css 解析为 React Native css?
有没有办法检索现有的 NSUrlSession/取消其任务?
基于现有的第二个 Interface Builder XIB 文件