我将错误范围缩小到了OpenGL调用:
glVertexAttribPointer(var.vertex, 4, GL_FLOAT, GL_FALSE, 0, 0);
Run Code Online (Sandbox Code Playgroud)
之前没有错误,之后也有GL_INVALID_OPERATION错误。输出到我的控制台是:
Error in Shader.cpp : bindMesh : 294
OpenGL Error: Invalid Operation
(0x502)
Bound Buffer: 1
var.vertex = 1
Run Code Online (Sandbox Code Playgroud)
据此,唯一适用的GL_INVALID_OPERATION条件是绑定缓冲区ID为0。但是绑定缓冲区ID为1。
我正在检查(并打印)以下错误:
printErrors();
int i = 0;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &i);
printf("\tBound Buffer: %i\n", i);
printf("\tvar.vertex = %i\n", var.vertex);
Run Code Online (Sandbox Code Playgroud)
在哪里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();
}
}
Run Code Online (Sandbox Code Playgroud)
怎么了
编辑:
var.vertex 发现于:
var.vertex = glGetAttribLocation(programID, "Vertex");
Run Code Online (Sandbox Code Playgroud)
并进行检查以确保通过if语句在绑定的着色器中找到var.vertex:
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);
}
Run Code Online (Sandbox Code Playgroud)
您必须在OpenGL 3.1上下文中绑定非零的顶点数组对象,而没有扩展名GL_ARB_compatibility或核心配置文件上下文。这是隐藏的条件之一,GL_INVALID_OPERATION每当您尝试执行与顶点数组有关的任何操作(例如,绘制,设置顶点指针等)时,都会生成a 。
好消息是,这是一个微不足道的问题。
至少,您需要做的就是在初始化程序时生成(glGenVertexArrays (...))和绑定(glBindVertexArray (...))一个顶点数组对象。
| 归档时间: |
|
| 查看次数: |
2513 次 |
| 最近记录: |