2017-04-21 85 views
1

如果某些東西不合適,那麼第一個問題很抱歉。使用OpenGL製作另​​一個對象

下面是一個工作得很好的代碼片段。

初始化函數

ShaderLoader shaderloader; 
    Program = shaderloader.LoadShaders("VertexShader.vs", "FragmentShader.fs"); 
    glGenVertexArrays(1, &VertexArrayObject); 
    glBindVertexArray(VertexArrayObject); 
    glGenBuffers(1, &VertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexBufferData) * 
    vertexBufferData.size(), &vertexBufferData.front(), GL_STATIC_DRAW); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(0); 
    glBindVertexArray(0); 

渲染功能

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glClearColor(0.0, 0.0, 0.0, 1.0); 
glUseProgram(Program); 
glBindVertexArray(VertexArrayObject); 
glDrawArrays(GL_TRIANGLES, 0, 6); 
glBindVertexArray(0); 
glutSwapBuffers(); 

這一切工作我的main.cpp內正常,但當我把這個放到一個類它給了我一個訪問衝突錯誤。我的類容器包含自己的VertexArrayObject和VertexBuffer,所以我假設應該有足夠的信息來繪製一個簡單的三角形,因爲它不在類中時可以很好地繪製。我的最終目標是創建兩個對象,所以如果我要完全錯誤的請指出我的方向正確!

代碼在精靈類:

void Mesh::init(std::vector<GLfloat> vertexBufferData) 
    { 
     glGenVertexArrays(1, &VertexArrayObject); 
     glBindVertexArray(VertexArrayObject); 
     glGenBuffers(1, &VertexArrayObject); 
     glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer); 
     glBufferData(GL_ARRAY_BUFFER, sizeof(vertexBufferData) *   
     vertexBufferData.size(), &vertexBufferData.front(), GL_STATIC_DRAW); 
     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
     glEnableVertexAttribArray(0); 
     glBindVertexArray(0); 
    } 

    void Mesh::Draw() 
    { 
     glBindVertexArray(VertexArrayObject); 
     glDrawArrays(GL_TRIANGLES, 0, 6); 
     glBindVertexArray(0); 
    } 

我如何使用類在main.cpp中:

Mesh object1; 

    void init() 
    { 
     ShaderLoader shaderloader; 
     Program = shaderloader.LoadShaders("VertexShader.vs", "FragmentShader.fs"); 
     object1.init(vertexBufferData); 
    } 

    void Render() 
    { 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glClearColor(0.0, 0.0, 0.0, 1.0); 
     glUseProgram(Program); 
     object1.Draw(); 
     glutSwapBuffers(); 
    } 

而拋出的異常是:0x5253F00A

訪問衝突閱讀地點

+3

請將錯誤消息和代碼放在實際放入類中的位置。 –

+0

已編輯。對於那個很抱歉! – Vishuu

+0

爲什麼按值傳遞頂點緩衝區數據? –

回答

1

您的Mesh類(反對代碼在t他頂部)兩次寫入相同的變量。這是一個簡單的錯字嗎?

glGenVertexArrays(1, &VertexArrayObject); 
glBindVertexArray(VertexArrayObject); 
glGenBuffers(1, &VertexArrayObject); 
       ^^^^^^^^^^^^^^^^^ 
+0

那麼怎麼樣... 你能爲我確認一件事嗎?當我把它全部放在主體中時,我也犯了這個錯誤,爲什麼它在那裏工作? – Vishuu

+0

@Vishuu可能是一個巧合。 OpenGL對象的名稱通常是隨着每個新名稱而增加的整數。因此,您在VertexArrayObject/VertexBuffer中最終得到的實際值可能都是1,並且由於某些原因而發生了變化。有很多方法可能導致OpenGL的糟糕用法變壞,或者更糟糕的是,假裝工作正常。 –

相關問題