OpenGL se estrella antes de que pueda hacer un marco - VBOS -- ++ campo con opengl campo con vbo campo con vao camp Relacionados El problema

OpenGL crashing before it can render a frame - VBOs


-2
vote

problema

Español

Después de renunciar a la técnica lenta de glbegin / glend, finalmente decidí usar VBOS. Después de horas y horas de frustración, finalmente lo puse para compilar. Pero no significa que funcione. La función "createvbo" se ejecuta sin errores, pero tan pronto como se llama glutMainLoop() , el programa se bloquea, ni siquiera llame al Reshape() o Render() Funciones.

Aquí está la función CreateVBO()6 : (Nota: la variable "líneas" es igual a 4 millones, todo el programa es solo una prueba de estrés para representar muchas líneas antes de poder hacer algo que realmente tiene sentido)

  void CreateVBO() {     glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");     glBindBuffer=(PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");     glBufferData=(PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");     glDeleteBuffers=(PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffers");     glMapBuffer=(PFNGLMAPBUFFERPROC)wglGetProcAddress("glMapBuffer");       for(float i=0; i<lines*2; i++)     {          t_vertices.push_back(i/9000);         t_vertices.push_back(5 * (((int)i%2)*2-1));         t_vertices.push_back(20);          vert_cols.push_back(0);         vert_cols.push_back(255);         vert_cols.push_back(0);           t_indices.push_back((int)i);     }      glGenBuffers(1, &VertexVBOID);     glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);     glBufferData(GL_ARRAY_BUFFER, sizeof(float)*t_vertices.size(), &t_vertices[0], GL_STATIC_DRAW);      glGenBuffers(1, &IndexVBOID);     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*t_indices.size(), NULL, GL_STATIC_DRAW);      GLvoid * buf = glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY );      memcpy( (void*)buf, &vert_cols[0], (size_t)(sizeof(float)*vert_cols.size()));      glBindBuffer( GL_ARRAY_BUFFER, 0 ); }   

y aquí está la función Render() . No sé qué puede estar equivocado ya que el programa se bloquea antes de que incluso llame a esa función.

  void Display() {     glRotatef(1, 0, 1, 0);     glClearColor(0, 0, 0, 0);     glClear(GL_COLOR_BUFFER_BIT);      glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);     glEnableClientState(GL_VERTEX_ARRAY);     glVertexPointer(t_vertices.size(), GL_FLOAT, 0, 0);   //The starting point of the VBO, for the vertices     glEnableClientState(GL_COLOR_ARRAY);     glColorPointer(vert_cols.size(), GL_FLOAT, 0, 0);      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);     glDrawElements(GL_LINES, lines, GL_UNSIGNED_INT, 0);     glutSwapBuffers();     //Sleep(16);     glutPostRedisplay(); }   
Original en ingles

After giving up on the slow glBegin/glEnd technique, I finally decided to use VBOs. After hours and hours of frustration, I finally got it to compile. But it doesn't mean it works. The function "CreateVBO" executes without errors, but as soon as glutMainLoop() is called, the program crashes, it doesn't even call the Reshape() or Render() functions.

Here is the CreateVBO() function: (note: the "lines" variable is equal to 4 million, the whole program is just a stress-test for rendering many lines before I can do something that actually makes sense)

void CreateVBO() {     glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");     glBindBuffer=(PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");     glBufferData=(PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");     glDeleteBuffers=(PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffers");     glMapBuffer=(PFNGLMAPBUFFERPROC)wglGetProcAddress("glMapBuffer");       for(float i=0; i<lines*2; i++)     {          t_vertices.push_back(i/9000);         t_vertices.push_back(5 * (((int)i%2)*2-1));         t_vertices.push_back(20);          vert_cols.push_back(0);         vert_cols.push_back(255);         vert_cols.push_back(0);           t_indices.push_back((int)i);     }      glGenBuffers(1, &VertexVBOID);     glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);     glBufferData(GL_ARRAY_BUFFER, sizeof(float)*t_vertices.size(), &t_vertices[0], GL_STATIC_DRAW);      glGenBuffers(1, &IndexVBOID);     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*t_indices.size(), NULL, GL_STATIC_DRAW);      GLvoid * buf = glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY );      memcpy( (void*)buf, &vert_cols[0], (size_t)(sizeof(float)*vert_cols.size()));      glBindBuffer( GL_ARRAY_BUFFER, 0 ); } 

And here's the Render() function. I don't know what may be wrong with it since the program crashes before even calling that function.

void Display() {     glRotatef(1, 0, 1, 0);     glClearColor(0, 0, 0, 0);     glClear(GL_COLOR_BUFFER_BIT);      glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);     glEnableClientState(GL_VERTEX_ARRAY);     glVertexPointer(t_vertices.size(), GL_FLOAT, 0, 0);   //The starting point of the VBO, for the vertices     glEnableClientState(GL_COLOR_ARRAY);     glColorPointer(vert_cols.size(), GL_FLOAT, 0, 0);      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);     glDrawElements(GL_LINES, lines, GL_UNSIGNED_INT, 0);     glutSwapBuffers();     //Sleep(16);     glutPostRedisplay(); } 
           
   
   

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Tu código no tiene sentido.

Primero, crea su vertexVBOID lo suficientemente grande como para sostener su vector glColorPointer1 y llénelo con exactamente esa matriz. Luego, mapea que VBO y sobrescriben los datos en ello con los datos del vector glColorPointer2 . Para dibujar, especifique tanto la posición del vértice como el atributo de color que vienen de la misma posición en la memoria, por lo que también usa el color como posición.

Pero esa no es la razón del choque. En realidad, hay dos razones principales para estrellarse:

  1. Cree IndexVBOID lo suficientemente grande como para mantener su matriz de índice, pero nunca inicia el tampón con algunos datos. En su lugar, especifique NULL como el puntero de datos, por lo que se crea el almacenamiento, pero se deja sin inicializar. Para que termine con un contenido indefinido en ese búfer, y el GL accederá a las posiciones de memoria arbraria al dibujar con eso.

  2. su glVertexPointer y glColorPointer6 Las llamadas son incorrectas. El primer parámetro, size , es no el tamaño de una matriz. Es el tamaño de un vector único , que puede ser 1,2,3 o 4. Su tamaño de matriz es probablemente otra cosa, por lo que esto llama a la generación de un GL_INVALID_VALUE Error, y no configurando los punteros de Attribs en absoluto. Y por defecto, esos punteros son nulos.

En última instancia, usted está pidiendo que la GL se extraiga de los índices de matriz indefinida en relación con un puntero nulo. Es muy probable que se estrelle. En general, solo es un comportamiento indefinido, y el resultado podría ser cualquier cosa.

Además, también mantiene el tampón glColorPointer9 TUQUE - Nunca lo desencades. No es válido usar un búfer como la fuente o destino para los comandos GL siempre que esté asignado (a menos que se cree una asignación persistente, que es una característica relativamente nueva que realmente no pertenece aquí).

 

Your code doesn't make sense.

First, you create your vertexVBOID big enough to hold your t_vertices vector, and fill it with exactly that array. Then, you map that VBO and overwrite the data in it with the data from the vert_color vector. For drawing, you specify both the vertex position and the color attribute to come from the same position in memory - so effectively using the color as position, too.

But that is not the reason of the crash. There are actually two main reasons for crashing:

  1. You create IndexVBOID big enough to hold your index array, but you never initalize that buffer with some data. You instead specify NULL as the data pointer, so the storage is created, but left uninitialized. So you end up with an undefined content in that buffer, and the GL will access arbtrary memory positions when drawing with that.

  2. Your glVertexPointer and glColorPointer calls are wrong. The first parameter, size, is not the size of an array. It is the size of a single vector, which can be 1,2,3 or 4. Your array size is probably something else, so this calls end up generating an GL_INVALID_VALUE error, and not setting the attrib pointers at all. And by default, those pointers are NULL.

So ultimately, you are asking the GL to draw from undefined array indices relative to a NULL pointer. That's very likely to crash. In general, it is just undefined behavior, and the result could be anything.

Furthermore, you also keep the VertexVBOID buffer mapped - you never unmap it. It is invalid to use a buffer as the source or destination for GL commands as long as it is mapped (unless a persistent mapping is created, which is a relatively new feature which doesn't really belong here).

 
 
 
 

Relacionados problema

121  ¿Qué son los objetos de la matriz de vértices?  ( What are vertex array objects ) 
Estoy empezando a aprender a OpenGL hoy desde este tutorial: http://openglbook.com/the-book / Llegué al Capítulo 2, donde dibujo un triángulo, y entiendo t...

-2  ¿Necesito llamar a GlenableVertexAttribarray si uso el VAOS?  ( Do i need to call glenablevertexattribarray if i use vaos ) 
entendí que la VAOS puede almacenar enlaces a VBOS e INDEX VBOS (ambos GL_ARRAY_BUFFER y GL_ELEMENT_ARRAY_BUFFER ), pero ahora tengo una pregunta: void ...

0  ¿Los Vaos también se unen automáticamente las matrices de los índices? [duplicar]  ( Do vaos also automatically bind indices arrays ) 
Esta pregunta ya tiene una respuesta aquí : ¿El VAO recuerda a ambos ¿EBO / IBO (elementos o índices...

1  Java Lwjgl la representación .OBJ correctamente  ( Java lwjgl rendering obj correctly ) 
A continuación, de mi clase principal, estoy tratando de prestar un objeto de un archivo Blender .OBJ después de que lo reformatee a (supuestamente) trabajar ...

0  ¿Cómo cargar VBO y hacerlo en hilos de Java separados?  ( How to load vbo and render it on separate java threads ) 
Para crear un mundo virtual, estoy usando la biblioteca de juegos de Java ligera (LWJGL) (Java + OpenGL). Quiero cargar mis terrenos en la memoria de tarjetas...

2  Problema con la representación de un quad en LWJGL 3 utilizando VaOS y VBOS  ( Problem with rendering a quad in lwjgl 3 using vaos and vbos ) 
(Esta es la segunda vez que estoy haciendo esta pregunta. La última vez que recibí una respuesta que no lo resolvió (la respuesta, se refirió un poco de códig...

5  OpenGL VERTEX ARRAY / BUFFER Objects  ( Opengl vertex array buffer objects ) 
Pregunta 1 ¿Los objetos de búfer de vértices creados bajo un cierto VAO eliminado una vez que se elimina el VAO? un ejemplo: MyDropDownList.DataTextF...

0  No se puede inscribirse en Vaos en múltiples posiciones en OpenGL  ( Unable to instance vaos at multiple positions in opengl ) 
He creado un VAO en OpenGL, compuesto por un VBO (2 triángulos), una matriz de índices y una matriz de posiciones. Sin embargo, la instancia que solo muestra ...

2  OpenGl Glfw, triángulo no representa  ( Opengl glfw triangle not rendering ) 
He estado tratando de hacer un triángulo en MacOS, pero no funciona. Aquí está mi código: setTimeout(this.slider, 2000);3 ...

1  espectáculos de luz pero el cubo no aparece  ( Light shows but the cube does not appear ) 
Estoy tratando de usar la iluminación en un cubo, pero no entiendo dónde voy mal. Puedo ver la fuente de luz, pero el resto de la pantalla aparece en negro, a...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos