La respuesta real primero:
Ver la respuesta de Goz. Mantenga 24 vértices separados.
Alguna nomenclatura segunda:
A Vertex es un conjunto de atributos de vértice. Tenga en cuenta esta distinción al leer lo siguiente:
Tiene la idea errónea de que el uso de API obsoletas lo ayudará a resolver el problema. Este no es el caso. OpenGL maneja (y siempre manejó) cada vértice como un conjunto único de atributos. Si usted lee la especificación original con cuidado, se dará cuenta de que cuando se hace:
glNormal()
glVertex()
glVertex()
glVertex()
La especificación establece claramente que glNormal
establece el current normal state
, y que provoca glVertex
un nuevo vértice, copia de paso toda la current state
, incluyendo el current normal state
. Es decir, aunque haya pasado solo una Normal, el GL todavía ve 3.
El GL, por lo tanto, no tiene atributos "por cara".
Además, se están mezclando las matrices de índice GL_ELEMENT_ARRAY_BUFFER
, que se utilizan de glDrawElements(..., pointer)
, donde pointer
es un desplazamiento dentro de la matriz de índice, y el vértice atribuyen matrices GL_ARRAY_BUFFER
, que se utilizan de glVertexAttribPointer
(y todo el DEPRECATED glVertexPointer/glNormalPointer
...
Cada índice que está en el búfer de índice se usará como índice en cada uno de los atributos, pero solo puede especificar un único índice para cada vértice. Por lo tanto, establecer GL_ELEMENT_ARRAY_BUFFER
y llamar al glVertexAttribPointer
, no funciona en absoluto lo que piensas que hace. Utiliza la última matriz configurada en GL_ARRAY_BUFFER
para definir los atributos de los vértices, o si no mantienes una ligada, está entre Preting su desplazamiento como puntero (y es probable que se bloquee).
Lo que intentaba hacer, establecer una matriz de índice para cada atributo de vértice, no es compatible con GL. Permítanme repetir esto: solo tiene 1 matriz de índice por sorteo.
Algunos detalles adicionales para la historia enclined:
glVertex es un nombre poco apropiado. Especifica solo el Vertex posición. Pero, y de esto recibe su nombre, también provoca que un vértice pase al GL. Para la API de estar completamente limpio, que podría haber imaginado tener que hacer 2 llamadas:
// not valid code
glPosition(1,2,3); // specifies the current vertex position
glProvoke(); // pass the current vertex to GL
Sin embargo, cuando GL se especifica en primer lugar, siempre se requiere de posición, por lo que la fusión de los 2 a provocar un vértice tenía sentido (si solo para reducir el conteo de llamadas API).
Avance rápido hasta vertex_program_arb
: el intento de alejarse del modelo de función fija sin dejar de ser compatible significaba que la naturaleza especial de glVertex tenía que llevarse adelante. Esto se logró haciendo que el vertex attribute 0
provocara, y un sinónimo de glVertex.
avance rápido hasta GL3.2: Begin/End modelo se ha ido, y todo esto especificación de lo que provoca un vértice puede finalmente desaparecerá, junto con la gestión de la current state
. También lo pueden hacer todas las API semánticas (glVertex *, glNormal * ...), ya que todas las entradas son solo atributos de vértices ahora.
Gracias de nuevo, Bahbar, por una respuesta muy completa :) Pero ahora tengo problemas para ver el punto de los búferes de índice en absoluto ...El "libro rojo" (7ma edición) me llevó a creer que estaba destinado a acomodar las posiciones de los vértices de reutilización que aparecen más de una vez en un modelo. incluso utiliza el cubo como ejemplo, indicando que "cada vértice se usa exactamente con tres caras". Por supuesto, no mencionan las normales/colores en el ejemplo ... – Wonko
¿Hay alguna manera de obtener este comportamiento en OpenGL? Para almacenar la posición, el color normal y el color por separado (y únicamente) y conectarlos a los vértices "sobre la marcha" ? Sería muy conveniente cuando se trabaja con archivos .obj, que hacen exactamente esto, y algoritmos que procesan cada posición de vértice una vez. – Wonko
Normalmente, una sola posición de vértice con diferentes normales es un signo de una costura. En cuanto a la mayoría de las mallas, estos vértices son la excepción, no la norma. La mayoría de las aplicaciones se benefician enormemente del uso de índices, ya que todos los atributos en superficies lisas son compartidos. En cuanto a los archivos .obj ... bueno, se crearon para 3ds max, no para renderizado en tiempo de ejecución. Tienes que hacer algún procesamiento para usarlos con cualquier API de gráficos. No hay forma de obtener este comportamiento en GL, porque no es así como lo hace el __hardware__. – Bahbar