2016-11-13 25 views
1

我正在關注OpenGL的一些教程,並且遇到了問題。我構建了一個名爲Mesh的類,該類在其構造函數中接受一個頂點數組,並生成頂點數組,並生成頂點數組,並繪製該頂點。問題是我沒有看到任何東西。下面是接口:OpenGL:vertexArray vs 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類型是一個簡單的類,看起來

class Vertex { 
public: 
    Vertex(glm::vec3 const & pos) { this->pos = pos;} 
private: 
    glm::vec3 pos; 
}; 

如果我改變的Mesh::Draw()

實施
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

我在其他地方設置了着色器,我很確定它們正常工作,因爲它們也確定可繪製的glBegin部分的顏色 – Slugger

+1

@Slugger:不可能編寫單個着色器,它可以與* * * glVertex *命令和'glVertexAttribPointer'命令。至少,不是沒有依靠NVIDIA的非標準行爲。所以我想看看你的着色器。 –

回答

0

更可能的是你的網類的析構函數是難辭其咎:

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

你有一個隱含的拷貝構造函數,它確實的字節對字節複製你的班級成員每當你需要Mesh的副本時。該逐字節複製包括OpenGL管理的資源的名稱(m_vertexArrayObject),這意味着您現在有兩個引用相同資源的不同對象。

只要其中一個副本超出範圍,它將刪除原始對象仍然引用的VAO。

解決此問題的最簡單方法是禁用複製構造函數(C++ 11爲此具有新的語法),然後在需要複製時隨時都會收到編譯器錯誤。

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

如果你確實要支持多個Mesh對象共享相同的頂點數組對象,你將需要添加引用計數,只有釋放VAO當引用計數爲0

相關問題