tutorial learn espaƱol descargar c++ opengl opengl-3

c++ - learn - glVertexAttribPointer raising GL_INVALID_OPERATION



opengl tutorial c++ (1)

Primero, saquemos algunos preliminares del camino:

glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

Deja de hacer esto. Ya solicitó un contexto OpenGL básico. No necesita compatibilidad con versiones anteriores, y no hace nada por usted. Esta era una bandera antigua cuando 3.0 había dejado de usar cosas pero no las eliminaba. No lo necesitas.

Sin embargo, eso no está causando tu problema. Esto es:

glEnableVertexAttribArray(program.getAttrib("in_Position")); // A call to getGLError() at this point prints nothing. glVertexAttribPointer(program.getAttrib("in_Position"), 3, GL_FLOAT, GL_FALSE, 0, 0); // A call to getGLError() at this point prints "OpenGL error 1282".

En primer lugar, hay un error obvio del controlador aquí, porque glEnableVertexAttribArray también debería haber emitido un error GL_INVALID_OPERATION . O cometiste un error cuando lo revisaste.

¿Por qué deberían ambas funciones error? Porque no usaste un objeto de matriz vértice . glEnableVertexAttribArray establece el estado en el VAO actual. No hay VAO actual, entonces ... error. Lo mismo vale para glVertexAttribPointer . Incluso está en la lista de errores para ambos en esas páginas.

No necesita un VAO en un contexto de compatibilidad, pero lo hace en un contexto central. Lo que pediste Entonces ... necesitas uno:

GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao);

Ponlo en algún lugar de tu configuración y tu programa funcionará.

Estoy tratando de armar una aplicación básica de OpenGL 3.2 (perfil central). En el siguiente código, que se supone que crea un VBO que contiene las posiciones de vértice para un triángulo, la llamada a glVertexAttribPointer falla y provoca el error de OpenGL GL_INVALID_OPERATION . ¿Qué significa esto y cómo podría solucionarlo?

GLuint vbo, attribLocation = glGetAttribLocation(...); glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); GLfloat vertices[] = { 0, 1, 0, 1, 0, 0, -1, 0, 0 }; glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glEnableVertexAttribArray(attribLocation); // At this point, glGetError() returns GL_NO_ERROR. glVertexAttribPointer(attribLocation, 3, GL_FLOAT, GL_FALSE, 0, 0); // At this point, glGetError() returns GL_INVALID_OPERATION.