2012-10-10 41 views
7

La guía de programación de OpenGL ES explica que debe evitar datos de vértices desalineados y ofrece un ejemplo de alineación de datos a bloques de 4 bytes.Qué tan importante es la alineación en los datos de vértices abiertos en iOS

OpenGL ES Programming Guide

Misaligned vs Aligned vertex data

Sin embargo, en la mayoría del material de demostración y tutoriales que he encontrado en Internet no veo a nadie haciendo esto. El siguiente ejemplo es de un proyecto de demostración en 71 Cuadrados:

static const SSTexturedVertexData3D EnemyFighterVertexData[] = { 
    {/*v:*/{1.987003, -0.692074, -1.720503}, /*n:*/{0.946379, -0.165685, -0.277261}, /*t:*/{0.972816, 0.024320}}, 

¿Y cómo lo harías de todos modos? Añadir un dummy 0.0 a la v y n y 2 de ellos a la t?

Supongo que si solo está cargando los datos de vértice una vez por aplicación, no importaría mucho, pero si su enlace y reenlace a diferentes matrices en cada fotograma procesado sería importante. Mi plan es combinar todos mis arreglos en uno de todos modos, pero tengo curiosidad.

+2

¿Está seguro de que lo anterior no está alineado con un límite de 4 bytes? Si el código que muestra utiliza GLfloats, esos son tipos de datos de 32 bits (4 bytes), por lo que no importa cuántos de ellos haya, siempre están alineados con un límite de 4 bytes. La guía se refiere a los pantalones cortos y otros tipos de datos. –

+0

Me estaba preguntando eso. ¡Gracias! Deberías poner eso como respuesta para poder marcarlo. – badweasel

+1

Podría, pero no responde la pregunta más fundamental de cuán importante es el alineamiento de bytes de los datos de vértices para el rendimiento. Eso podría requerir algunos puntos de referencia para ilustrar completamente. –

Respuesta

2

General, un vértice se compone de floats que se alinearán, por lo que no es necesario preocuparse demasiado por eso. De hecho, muchos libros usan struct s ordinarios para contener datos de vértices, que no se garantiza que sean contiguos debido al problema de relleno, pero si todo lo que tienes son flotantes, está bien ya que no es probable que tengas relleno. Por supuesto, algunas personas (incluyéndome a mí) prefieren usar el STL vector de C++, pero si estás en iOS, mientras que puedes usar C++ probablemente estés usando Objective-C, así la contigüidad de una forma no estructural involucraría matrices normales de C que no es tan divertido trabajar con ellos.

Si crea estructuras personalizadas para contener datos de vértice, así como otros datos para su objeto dibujable, y usa short u otros tipos, puede encontrar relleno para convertirse en un problema. Pero si te quedas con solo float s estarás bien, y estarás en buena compañía ya que la mayoría de las fuentes educativas en OpenGL lo hacen.

+0

Soy iOS pero evito el uso de estructuras objetivas c para cualquier cosa opengl. Normalmente uso "static const GLfloat Vertex []" y luego lo cargo en un VBO. Extrañamente, para 2d sprites realmente uso un documento de Excel personalizado para crear todos mis datos de vértice. Para 3d, importo el archivo obj y lo guardo como un archivo binario para cargarlo rápidamente en el juego. Estoy dispuesto a darle la marca de verificación solo por el esfuerzo. Sin embargo, el punto de Brad Larson en el comentario sobre mi pregunta es que no es responsable sin pruebas. Puede ser un punto válido. – badweasel

+0

Otra nota .. Odio esto sobre stackoverflow, donde quieres responder una pregunta y buscas ... luego elaboras tu respuesta solo para darte cuenta de que la pregunta tiene uno o dos años. Entonces, obviamente, la respuesta que utilicé fue la de Brad, que ya estaba dentro de los límites de 4 bytes ... hace un año. :) – badweasel

+0

@badweasel Por curiosidad, ¿qué técnica estás usando en iOS para importar obj y luego serializar a binario? ¿Está aprovechando GLKit u otra biblioteca para la conversión, o está convirtiendo los datos de texto OBJ usted mismo? Y entonces, ¿con qué método estás creando el binario? –

Cuestiones relacionadas