2014-02-13 51 views
2

我有誤差縮小到這個OpenGL的電話:glVertexAttribPointer不可能提升GL_INVALID_OPERATION?

glVertexAttribPointer(var.vertex, 4, GL_FLOAT, GL_FALSE, 0, 0); 

有才不會出錯,而且有一個GL_INVALID_OPERATION錯誤之後。 輸出到我的控制檯:

Error in Shader.cpp : bindMesh : 294 
     OpenGL Error: Invalid Operation 
     (0x502) 
     Bound Buffer: 1 
     var.vertex = 1 

According to this,可以適用是0綁定緩存ID,但綁定緩存ID爲1

我檢查的唯一GL_INVALID_OPERATION條件(和印刷)與錯誤:

printErrors(); 
int i = 0; 
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &i); 
printf("\tBound Buffer: %i\n", i); 
printf("\tvar.vertex = %i\n", var.vertex); 

其中printErrors()被定義爲

void PrintErrors(const char* file, const char* func, int line); 
#define printErrors() PrintErrors(__BASE_FILE__,__func__,__LINE__) 

void PrintErrors(const char* file, const char* func, int line) 
{ 
    const char* errors[] = { 
     "OpenGL Error: Invalid Enumeration\n", 
     "OpenGL Error: Invalid Value\n", 
     "OpenGL Error: Invalid Operation\n", 
     "OpenGL Error: Invalid Frame-Buffer Operation\n", 
     "OpenGL Error: Out of Memory\n", 
     "OpenGL Error: Stack Underflow\n", 
     "OpenGL Error: Stack Overflow\n", 
    }; 

    uint32 i = glGetError(); 
    while (i != GL_NO_ERROR) 
    { 
     printf("Error in %s : %s : %i\n\t%s\t(0x%x)\n", file, func, line, errors[i - GL_INVALID_ENUM], i); 
     i = glGetError(); 
    } 
} 

怎麼回事?

編輯:

var.vertex被發現:

var.vertex = glGetAttribLocation(programID, "Vertex"); 

,有一個檢查,以確保var.vertex在綁定的着色器被發現的if語句:

if (var.vertex != INVALID_SHADER_VARIABLE) // INVALID_SHADER_VARIABLE = 0xFFFFFFFF (-1 if it where a signed int) 
{ 
    glBindBuffer(...); 
    glBuffferData(...); 
    glEnableVertexAttribArray(var.vertex); 
    glVertexAttribPointer(var.vertex, 4, GL_FLOAT, GL_FALSE, 0, 0); 
} 
+0

您可能擁有核心配置文件上下文,並且沒有綁定VAO。這是會導致此錯誤的「不可能」條件之一。對於諸如「GL_INVALID_OPERATION」或「GL_OUT_OF_MEMORY」之類的錯誤,手冊頁遠未完成。 –

+0

檢查shader_inputs是否正確......並檢查你的着色器是否正在編譯而沒有鏈接錯誤 – jpm

+0

@ AndonM.Coleman:我很確定它現在是兼容性上下文。 (OpenGL 3.0)Dang,有一個完整的清單,還是僅僅從經驗中學習? @whiteFang:是的,着色器輸入正確,着色器編譯/鏈接正確。 'glEnableVertexAttribArray'也被稱爲。 –

回答

3

您必須在OpenGL 3.1上下文中綁定非零頂點數組對象,而不使用擴展名GL_ARB_compatibility或核心配置文件上下文。這是隱藏的條件,這將產生一個GL_INVALID_OPERATION每當你嘗試做相關的頂點數組的任何一個(抽獎,設置頂點指針,

好消息是,這是一個很小的問題修理。

至少,您需要做的是在初始化程序時生成(glGenVertexArrays (...))並綁定(glBindVertexArray (...))頂點數組對象。

+0

我以爲glBindBuffer(GL_ARRAY_BUFFER,...)是你所需要的。我想你也需要一個VAO。 –

+0

是的,這改變了OpenGL 3.1。頂點數組對象實際上是存儲頂點數組指針的地方,如果你在GL的新版本中沒有一個活動,那麼就沒有地方來存儲這個狀態。因此,嘗試設置狀態是無效的操作。在兼容性配置文件中,這不是問題,頂點數組狀態仍然作爲正常狀態機的一部分存在。 –

+0

哇,我花了2h與同樣不可能的GL_INVALID_OPERATION,這正是缺少的VAO。謝謝哥們! – fegemo