我有誤差縮小到這個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);
}
您可能擁有核心配置文件上下文,並且沒有綁定VAO。這是會導致此錯誤的「不可能」條件之一。對於諸如「GL_INVALID_OPERATION」或「GL_OUT_OF_MEMORY」之類的錯誤,手冊頁遠未完成。 –
檢查shader_inputs是否正確......並檢查你的着色器是否正在編譯而沒有鏈接錯誤 – jpm
@ AndonM.Coleman:我很確定它現在是兼容性上下文。 (OpenGL 3.0)Dang,有一個完整的清單,還是僅僅從經驗中學習? @whiteFang:是的,着色器輸入正確,着色器編譯/鏈接正確。 'glEnableVertexAttribArray'也被稱爲。 –