2013-05-22 73 views
0

draw_data下面的所有方法都是繪製一個帶有兩個三角形的正方形。因此,硬編碼值。廣場渲染就好,但是,我得到垃圾郵件與glDrawElements()在無效的情況下返回GL_INVALID_ENUM

vertex_renderer::draw_vertex_data()GL ERROR: Invalid enum.

從我的代碼。難道我做錯了什麼?

我的渲​​染方法如下:

bool draw_data(const GLsizei start_index = 0, GLsizei index_count = 0) { 
    if (!vbo_id_ || start_index + index_count > index_count_) { 
    return false; 
    } 

    if (index_count == 0) { 
    index_count = index_count_; 
    } 

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); 

    return !gl_errors::what_errors("vertex_renderer::draw_vertex_data()"); 
} 

gl_errors :: what_errors定義如下:

class gl_errors 
{ 
public: 
    static bool what_errors(const char * const prefix) { 
    GLenum errorCode; 
    bool is_error = false; 

    while ((errorCode = glGetError()) != GL_NO_ERROR) { 
     switch (errorCode) { 
     case(GL_INVALID_ENUM): { 
     std::cout << prefix << "GL ERROR: Invalid enum." << std::endl; 
     is_error = true; 
     } 
     break; 
     case(GL_INVALID_VALUE): { 
     std::cout << prefix << "GL ERROR: Invalid value." << std::endl; 
     is_error = true; 
     } 
     break; 
     case(GL_INVALID_OPERATION): { 
     std::cout << prefix << "GL ERROR: Invalid operation." << std::endl; 
     is_error = true; 
     } 
     break; 
     case(GL_STACK_OVERFLOW): { 
     std::cout << prefix << "GL ERROR: Stack overflow." << std::endl; 
     is_error = true; 
     } 
     break; 
     case(GL_STACK_UNDERFLOW): { 
     std::cout << prefix << "GL ERROR: Stack underflow." << std::endl; 
     is_error = true; 
     } 
     break; 
     case(GL_OUT_OF_MEMORY): { 
     std::cout << prefix << "GL ERROR: Out of memory." << std::endl; 
     is_error = true; 
     } 
     break; 
     } 
    } 
    return is_error; 
    } 
}; 

UPDATE

GLsizei stride = sizeof(verticies_t); 
pos_id_ = basic_shader_.get_attribute("position"); 
glEnableVertexAttribArray(pos_id_); 
glVertexAttribPointer(pos_id_, 2, GL_FLOAT, GL_FALSE, stride, 0); 
gl_extensions::gl_errors::what_errors("1"); 

這是罪魁禍首,然而,我不明白爲什麼這會導致問題。 GL_FLOAT是一個有效的枚舉。

+7

在調用'glDrawElements'之前是否有錯誤? – yiding

+0

有,這是一個很好的觀點,讓我仔細檢查,以確保每次通話後我都會檢查錯誤。 –

回答

1

glDrawElements具有下將其返回GL_INVALID_ENUMhttp://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml)只有一個條件:

GL_INVALID_ENUM is generated if mode is not an accepted value.

這應該使你對其他調用到API可疑的,因爲你的glDrawElements調用有一個有效的模式。添加更多的檢查到以前的電話,看看你是否追查你的問題。

+0

在完成另一項任務之後繼續工作。 –

+0

更新了我的答案。 –

+0

好點,但對於那些在OpenGL ES2上的人:小心!如果您使用整數索引而不是字節或短褲,INVALID_ENUM也會觸發。 https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glDrawElements.xml – Bram

相關問題