C++ 仅当使用opengl 3.2或更高版本上下文时,GLVertexAttributePointer和GLDrawArray的GL_ERROR==1282
我不能100%确定这篇文章标题中描述的错误是从哪里来的。它可以是上下文创建,也可以是实际的图形代码。我将从绘图代码开始。下面的代码将在2.0到3.1版本的上下文中呈现,但在3.2或更高版本的上下文中停止呈现。应该注意的是,上下文是使用glX系列函数创建的。如果需要该代码,请在评论部分发布。我还假设GLDrawArray的错误与在顶点着色器中获取位置变量的顶点属性指针时生成的错误有关 绘图和初始化代码如下所示:C++ 仅当使用opengl 3.2或更高版本上下文时,GLVertexAttributePointer和GLDrawArray的GL_ERROR==1282,c++,linux,opengl,C++,Linux,Opengl,我不能100%确定这篇文章标题中描述的错误是从哪里来的。它可以是上下文创建,也可以是实际的图形代码。我将从绘图代码开始。下面的代码将在2.0到3.1版本的上下文中呈现,但在3.2或更高版本的上下文中停止呈现。应该注意的是,上下文是使用glX系列函数创建的。如果需要该代码,请在评论部分发布。我还假设GLDrawArray的错误与在顶点着色器中获取位置变量的顶点属性指针时生成的错误有关 绘图和初始化代码如下所示: void start_func() { // Create Window //
void start_func()
{
// Create Window
// Create Context
// Start Message Pump
// Clean Up
}
GLuint vbo;
GLuint shaderProgram;
bool compiler_errors(GLuint shaderId)
{
bool errors = false;
GLint isCompiled = 0;
glGetShaderiv(shaderId, GL_COMPILE_STATUS, &isCompiled);
GL_CALL("glGetShaderiv")
if(isCompiled == GL_FALSE) {
GLint maxLength = 0;
glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &maxLength);
GL_CALL("glGetShaderiv")
std::vector<char> errorLog(maxLength);
glGetShaderInfoLog(shaderId, maxLength, &maxLength, &errorLog[0]);
GL_CALL("glGetShaderInfoLog")
std::stringstream out;
std::copy(errorLog.begin(), errorLog.end(),
std::ostream_iterator<char>(out, ""));
std::string errorsStr = out.str();
std::cerr << "Shader Compiler Erros " << errorsStr.c_str();
errors = true;
}
return errors;
}
void init()
{
const GLchar* vertexSource =
"#version 150 core\n"
"in vec2 position;"
"void main()"
"{"
" gl_Position = vec4(position, 0.0, 1.0);"
"}";
const GLchar* fragmentSource =
"#version 150 core\n"
"out vec4 outColor;"
"void main()"
"{"
" outColor = vec4(1.0, 1.0, 1.0, 1.0);"
"}";
glGenBuffers(1, &vbo); GL_CALL(glGenBuffers)
GLfloat vertices[] = {
+0.0f, +0.5f,
+0.5f, -0.5f,
-0.5f, -0.5f
};
glBindBuffer(GL_ARRAY_BUFFER, vbo); GL_CALL(glBindBuffer)
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices,
GL_STATIC_DRAW); GL_CALL(glBufferData)
// Create and compile the vertex shader
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
GL_CALL(glCreateShader)
glShaderSource(vertexShader, 1, &vertexSource, NULL);
GL_CALL(glShaderSource)
glCompileShader(vertexShader);
GL_CALL(glCompileShader)
if(compiler_errors(vertexShader) == GL_TRUE) {
throw std::runtime_error("Failed to compile vertex shader.");
}
// Create and compile the fragment shader
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
GL_CALL(glCreateShader)
glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
GL_CALL(glShaderSource);
glCompileShader(fragmentShader);
GL_CALL(glCompileShader);
if(compiler_errors(fragmentShader) == GL_TRUE) {
throw std::runtime_error("Failed to compile fragment shader.");
}
// Link the vertex and fragment shader into a shader program
shaderProgram = glCreateProgram();
GL_CALL(glCreateProgram)
glAttachShader(shaderProgram, vertexShader);
GL_CALL(glAttachShader);
glAttachShader(shaderProgram, fragmentShader);
GL_CALL(glAttachShader);
glLinkProgram(shaderProgram);
GL_CALL(glLinkProgram);
glUseProgram(shaderProgram);
GL_CALL(glUseProgram);
}
void render()
{
glViewport(0, 0, 800, 600); GL_CALL(glViewport)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); GL_CALL(glClear)
// Clear the screen to black
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GL_CALL("glClearColor")
glClear(GL_COLOR_BUFFER_BIT);
GL_CALL("glClear(GL_COLOR_BUFFER_BIT)")
// Draw a triangle from the 3 vertices
glUseProgram(shaderProgram);
GL_CALL("glUseProgram")
glBindBuffer(GL_ARRAY_BUFFER, vbo);
GL_CALL("glBindBuffer")
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
GL_CALL("glGetAttribLocation")
glEnableVertexAttribArray(posAttrib);
GL_CALL("glEnableVertexAttribArray")
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
GL_CALL("glVertexAttribPointer")
glDrawArrays(GL_TRIANGLES, 0, 3);
GL_CALL("glDrawArrays")
}
int main(int argc, char *argv[])
{
...
start_func();
...
}
在核心纵断面中,必须使用顶点阵列对象VAO。在3.2之前,VAO 0是一个有效对象,可以说是一个全局状态VAO,但从3.2开始 核心,VAO 0是无效的对象。由于您不创建和绑定自己的VAO,因此每当您尝试修改VAO状态GLVERTEXATTRIBPOINT或尝试使用无效的0 VAO绘制时,都会出现GL_INVALID_操作错误
可以找到更多信息。在核心配置文件中,必须使用顶点数组对象VAO。在3.2之前,VAO 0是一个有效对象,可以说是一个全局状态VAO,但从3.2开始 核心,VAO 0是无效的对象。由于您不创建和绑定自己的VAO,因此每当您尝试修改VAO状态GLVERTEXATTRIBPOINT或尝试使用无效的0 VAO绘制时,都会出现GL_INVALID_操作错误
可以找到更多信息。只需一个旁注,您可以设置一次“清除颜色”,并在渲染中调用glClear,但不能多次调用。因此,将glClearColor移出循环,并删除行glClearGL\u COLOR\u BUFFER\u位;那么glu叫什么?它使您的代码非常难以阅读。@eldo GL_CALL是一个宏,用于检查dbug构建中opengl中的错误。在release中,它是一个空语句。只是一个旁注,您只需设置一次clear color,并在render中调用glClear,但不能多次调用。因此,将glClearColor移出循环,并删除行glClearGL\u COLOR\u BUFFER\u位;那么glu叫什么?它使您的代码非常难以阅读。@eldo GL_CALL是一个宏,用于检查dbug构建中opengl中的错误。在发行版中,这是一个空的声明。谢谢BDL。我从来没有想到这就是问题所在。谢谢你的回答,它帮助我解决了我的问题。然而,从3.1 opengl的版本来看,您所说的是正确的。我用3.0试过了,它还在工作。对于3.1,它不是。谢谢BDL。我从来没有想到这就是问题所在。谢谢你的回答,它帮助我解决了我的问题。然而,从3.1 opengl的版本来看,您所说的是正确的。我用3.0试过了,它还在工作。对于3.1,它不是。