Preguntas sobre mi OpenGL – código

He estado comenzando a sumergirme en OpenGL ES 2.0 en los últimos días, pero aún tengo resultados realmente defectuosos. Una cosa que no acabo de entender es cómo debo configurar mis buffers correctamente.

Me gustaría crear una forma como esta: una especie de carpa, si quieres, sin el lado izquierdo y derecho.

3_______________________2 |\ /| | \_ _ _ _ _ _ _ _ _ _/ | | /4 5\ | |/_____________________\| 0 1 

Entonces comencemos con mi textura / índices / vértices matriz:

Eso es lo que configuré:

 #define RECT_TOP_R {1, 1, 0} #define RECT_TOP_L {-1, 1, 0} #define RECT_BOTTOM_R {1, -1, 0} #define RECT_BOTTOM_L {-1, -1, 0} #define BACK_RIGHT {1, 0, -1.73} #define BACK_LEFT {-1, 0, -1.73} const GLKVector3 Vertices[] = { RECT_BOTTOM_L, //0 RECT_BOTTOM_R, //1 RECT_TOP_R, //2 RECT_TOP_L, //3 BACK_LEFT, //4 BACK_RIGHT //5 }; const GLKVector4 Color[] = { {1,0,0,1}, {0,1,0,1}, {0,0,1,1}, {0,1,0,1}, {1,0,0,1}, {0,1,0,1}, {0,0,1,1}, {0,1,0,1} }; const GLubyte Indices[] = { 0,1,3, 2,4,5, 0,1 }; const GLfloat texCoords[] = { 0,0, 1,0, 0,1, 1,1, 1,1, 0,0, 0,0, 1,0 }; 

Aquí genero / enlace las memorys intermedias.

 glGenBuffers(1, &vertexArray); glBindBuffer(GL_ARRAY_BUFFER, vertexArray); glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition,3,GL_FLOAT,GL_FALSE,sizeof(Vertices),0); glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); glGenBuffers(1, &indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW); glGenBuffers(1, &colArray); glEnableVertexAttribArray(GLKVertexAttribColor); glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Color), 0); glBufferData(GL_ARRAY_BUFFER, sizeof(Color), Color, GL_STATIC_DRAW); glGenBuffers(1, &texArray); glEnableVertexAttribArray(GLKVertexAttribTexCoord0); glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(texCoords),0); glBufferData(GL_ARRAY_BUFFER, sizeof(texCoords), texCoords, GL_STATIC_DRAW); 

Entonces tengo una pregunta sobre los búferes:

  • ¿Cuál es la diferencia entre GL_ARRAY_BUFFER y GL_ELEMENT_ARRAY_BUFFER?

Aquí está el método gelegate, que se llama cada vez que vuelve a dibujar:

 - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { self.contentScaleFactor = 2.0; self.opaque = NO; glClearColor(1.0f, 1.0f, 1.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); [self.effect prepareToDraw]; glDrawElements(GL_TRIANGLE_STRIP, sizeof(Indices), GL_UNSIGNED_BYTE, 0); } 

Entonces, el código, obviamente, no funciona en consecuencia. Me podría ayudar ? He intentado que funcione, pero estoy perdiendo los nervios.

Ok, entonces definitivamente hice algo mal allí. Reuse el código de un website que básicamente almacena todos los datos de Vertex en una estructura. Sin embargo, he cambiado el código, porque he separado las matrices de attributes individuales (colors, coorderadas de textura) en matrices individuales. Antes, la estructura estaba almacenada en el búfer por sí misma, por lo que la estructura fue procesada por la GPU como un todo con la matriz de textura y la matriz de colors. Ahora, después de mis cambios, necesito generar y unir esos búferes individualmente.

Otro problema que pude resolver en parte fue el que tenía los índices y el mapeo de texturas. No sé si lo entendí bien, pero si asigno las coorderadas de textura (x, y) a un cierto índice y luego reutilice ese índice, con el objective de tener otra textura coordinada en ese lugar exacto, entonces aparentemente no lo haría Tengo motivos para preguntarme por qué todo está en mal estado.

Lo que terminé haciendo no resolvió exactamente mi problema, pero me acerqué mucho a mi meta establecida y estoy bastante orgulloso de mi curva de aprendizaje en lo que respecta a openGL. Esta respuesta está destinada a otros que podrían enfrentar los mismos problemas y espero que no divulgue ninguna información incorrecta aquí. Por favor, siéntete libre de editar / señalar cualquier error.

En respuesta a su propia respuesta, los datos de vértice en una estructura que mencionó se llaman estructuras de matrices. Apple recomienda que uses este layout .