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 文件

有没有办法将 Redis 层设置为 OpsWorks 中现有的 Rails 应用程序?

有没有办法配置 Elastic Beanstalk 以连接到现有的 Oracle 数据库(没有 BYOL)?