2016-11-13 3 views
1

私はOpenGLに関するいくつかのチュートリアルに従っており、問題が発生しています。 Meshというクラスを作成しました。このクラスはそのコンストラクタで頂点の配列をとり、頂点配列などを生成して描画を行います。問題は、私は何も見ていないということです。OpenGL:vertexArrayとglBegin()

class Mesh 
{ 
public: 
    Mesh(Vertex * vertices, size_t numVertices); 
    virtual ~Mesh(); 

    void Draw(); 
private: 
    enum {  POSITION_VB, NUM_BUFFERS }; 

    GLuint m_vertexArrayObject; 
    GLuint m_vertexArrayBuffers; 
    size_t m_drawCount; 
}; 

、ここで実装

#include "mesh.h" 

Mesh::Mesh(Vertex *vertices, size_t numVertices) 
{ 
    m_drawCount = numVertices; 

    glGenVertexArrays(1, &m_vertexArrayObject); 
    glBindVertexArray(m_vertexArrayObject); 

    glGenBuffers(NUM_BUFFERS, &m_vertexArrayBuffers); 
    glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers); 
    glBufferData(GL_ARRAY_BUFFER, numVertices * sizeof(vertices[0]), vertices, GL_STATIC_DRAW); 

    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glBindVertexArray(0); 
} 

void Mesh::Draw() 
{ 
    glBindVertexArray(m_vertexArrayObject); 
    glDrawArrays(GL_TRIANGLES, 0, m_drawCount); 
    glBindVertexArray(0); 
} 

Mesh::~Mesh() 
{ 
    glDeleteVertexArrays(1, &m_vertexArrayObject); 
} 

Vertex I型Mesh::Draw()

への実装を変更した場合
class Vertex { 
public: 
    Vertex(glm::vec3 const & pos) { this->pos = pos;} 
private: 
    glm::vec3 pos; 
}; 

ように見える単純なクラスですされています。ここではインターフェースがあります
glBegin(GL_TRIANGLES);    
glVertex3f(-1.0f, -0.25f, 0.0f); //triangle first vertex 
glVertex3f(-0.5f, -0.25f, 0.0f); //triangle second vertex 
glVertex3f(-0.75f, 0.25f, 0.0f); //triangle third vertex 
glEnd();       //end drawing of triangles 

画面に三角形が印刷されています。私の質問です:これは必ず、Meshのメンバー関数の実装にエラーがあることを意味しますか?もしそうなら誰でもそれを見つけることができますか?私は、glBeginメソッドが、vertexarrayメソッドがバイパスできないコードのどこか別のエラーをバイパスするかもしれないと考えました。私はどんな助けにも感謝しています。また、必要に応じて追加コードを投稿することもできます。

シェーダコード:

#version 120 

void main() 
{ 
    gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); 
} 
+1

シェイダーについてはどうですか? –

+0

私はシェーダを別の場所に設定していますが、drawableであるglBeginの部分の色を決定するので正しく機能していることを確信しています – Slugger

+1

@Slugger:*両方とも 'glVertexで使うことができる単一のシェーダを書くことは不可能です* 'コマンドと' glVertexAttribPointer'コマンドです。少なくとも、NVIDIAの非標準的な動作に頼るのではありません。だから私はあなたのシェイダーを見たいと思います。 –

答えて

0

おそらくあなたのメッシュクラスのデストラクタを非難するよりも、もっと:

Mesh::~Mesh() 
{ 
    glDeleteVertexArrays(1, &m_vertexArrayObject); 
} 

あなたがのバイト単位のコピーを行い、暗黙のコピーコンストラクタを持っていますMeshのコピーが必要な場合は、クラスのメンバーにお尋ねください。 byte-for-byteコピーには、OpenGL管理のリソースの名前(m_vertexArrayObject)が含まれています。つまり、同じリソースを参照する2つの異なるオブジェクトが存在することになります。

これらのコピーの1つが有効範囲外になると、元のオブジェクトによって引き続き参照されているVAOが削除されます。

この問題を解決する最も簡単な方法は、コピーコンストラクタを無効にすることです(C++ 11にはこのための新しい構文があります)。コピーが必要なときはいつでもコンパイラエラーが発生します。

private: 
    Mesh (const Mesh& original); // Copy ctor is inaccessible. 

あなたが本当に同じ頂点配列オブジェクトを共有する複数のMeshオブジェクトをサポートしたい場合は、参照カウントを追加し、唯一の参照カウントがに達したときにVAOを解放する必要があります。

関連する問題