質問編集履歴

1 エラー発生位置が間違っていたため、修正。

kogane1185

kogane1185 score 1

2016/02/28 13:34  投稿

OpenGLのglDeleteBuffersでAccess violation.
OpenGLを使用してアプリケーションを作成しているのですが、glDeleteBuffersで[Access violation reading location]を吐いてしまいます。
glDeleteBuffers以外は正常に作動しているように見えるのですが、何が原因でglDeleteBuffersができないのでしょうか。
考えられる原因としてWorldがシングルトンでデストラクタが呼ばれる際に、OpenGLのcontextがすでに存在しないからと思っております。もしそうならば、どのようにリソース管理をするのが正しいのでしょうか。
複数のビューに同じ視点違いの同じオブジェクトを描画したいため、すべて一つのcontextにリソースを入れるわけにはいかないのですが……。
```lang-cpp
   void GLWidget::paintGL()
   {
       // 何行かのシェーダーとビュー行列プロジェクション行列の転送処理。
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
       World::get().draw();
   }
```
```lang-cpp
   class World
   {
   public:
       World(const World&) = delete;
       World& operator=(const World&) = delete;
       World(World&&) = delete;
       World& operator=(World&&) = delete;
       static World& get()
       {
           static World instance;
           return instance;
       }
       void addObject(std::shared_ptr<ObjectBase> object)
       {
           _objects.push_back(object);
       }
       void draw()
       {
           for (const auto& object : _objects)
           {
               object->draw();
           }
       }
   private:
       World() = default;
       ~World() = default;
       std::vector<std::shared_ptr<ObjectBase>> _objects;
   };
```
```lang-cpp
   class ObjectBase : protected QOpenGLFunctions
   {
   public:
       ObjectBase();
       virtual ~ObjectBase();
       virtual void initialize() = 0;
       virtual void draw() = 0;
   protected:
       GLuint _positionBuffer;
       GLuint _indexBuffer;
   };
   ObjectBase::ObjectBase()
       : _positionBuffer(0)
       , _indexBuffer(0)
   {
       initializeOpenGLFunctions();
       glGenBuffers(1, &_positionBuffer); // エラー発生
       glGenBuffers(1, &_positionBuffer);
       glGenBuffers(1, &_indexBuffer);
   }
   ObjectBase::~ObjectBase()
   {
       if (_positionBuffer)
       {
           glDeleteBuffers(1, &_positionBuffer);
           glDeleteBuffers(1, &_positionBuffer); // エラー発生
       }
       if (_indexBuffer)
       {
           glDeleteBuffers(1, &_indexBuffer);
       };
   }
```
```lang-cpp
   PolygonObject::PolygonObject()
       : ObjectBase()
   {
   }
   PolygonObject::~PolygonObject()
   {
   }
   void PolygonObject::initialize()
   {
       glBindBuffer(GL_ARRAY_BUFFER, _positionBuffer);
       glBufferData(GL_ARRAY_BUFFER, sizeof(QVector3D)*_vertices.size(), &_vertices.front(), GL_STATIC_DRAW);
       glBindBuffer(GL_ARRAY_BUFFER, _indexBuffer);
       glBufferData(GL_ARRAY_BUFFER, sizeof(GLuint)*_indices.size(), &_indices.front(), GL_STATIC_DRAW);
       glBindBuffer(GL_ARRAY_BUFFER, 0);
       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
   }
   void PolygonObject::draw()
   {
       glBindBuffer(GL_ARRAY_BUFFER, _positionBuffer);
       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
       glEnableClientState(GL_VERTEX_ARRAY);
       glVertexPointer(3, GL_FLOAT, 0, 0);
       glDrawElements(GL_TRIANGLES, (GLsizei)_indices.size(), GL_UNSIGNED_INT, 0);
       glDisableClientState(GL_VERTEX_ARRAY);
       glBindBuffer(GL_ARRAY_BUFFER, 0);
       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
   }
```
  • C++

    4667 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenGL

    215 questions

    OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

  • OpenGL ES

    34 questions

    携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

  • Qt

    212 questions

    QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る