Ok, todavía estoy luchando para que esto funcione. Las partes importantes de mi código son:glDrawArrays vs glDrawElements
def __init__(self, vertices, normals, triangles):
self.bufferVertices = glGenBuffersARB(1)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(vertices), ADT.voidDataPointer(vertices), GL_STATIC_DRAW_ARB)
self.vertices = vertices
self.bufferNormals = glGenBuffersARB(1)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(normals), ADT.voidDataPointer(normals), GL_STATIC_DRAW_ARB)
self.normals = normals
self.bufferTriangles = glGenBuffersARB(1)
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles)
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, ADT.arrayByteCount(triangles), ADT.voidDataPointer(triangles), GL_STATIC_DRAW_ARB)
self.triangles = triangles
glDisableClientState(GL_VERTEX_ARRAY) **(Not sure if any of the following influence in any way)**
glDisableClientState(GL_NORMAL_ARRAY)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0)
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0)
no creo que haya nada malo aquí, por lo que he leído hasta ahora acerca de VBO. Así que ahora tengo mis buffers de vértices, normales (no utilizados aún) e índices de triángulos. Ahora para el sorteo real:
def draw(self, type):
glDisableClientState(GL_VERTEX_ARRAY)
glDisableClientState(GL_NORMAL_ARRAY)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0)
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0)
**Again above line not sure if they have any use.**
glEnableClientState(GL_VERTEX_ARRAY)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
glVertexPointer(3, GL_FLOAT, 0, None)
glEnableClientState(GL_NORMAL_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
glNormalPointer(GL_FLOAT, 0, None)
if type == GL_POINTS:
#glDrawArrays(GL_POINTS, 0, len(self.vertices));
glDrawElements(type, len(self.vertices), GL_UNSIGNED_SHORT, 0)
else:
#glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles)**(If I uncomment this doesnt seem to make any difference?!)**
#glDrawArrays(GL_TRIANGLES, 0, len(self.triangles));
glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, 0)**(What does it draw now since GL_ELEMENT_ARRAY_BUFFER_ARB is binded to 0 ?!)**
Ahora funciona el glDrawArrays. Pero en el caso en que tengo que dibujar mis triángulos, no dibuja los triángulos que he definido en los TIPOS de Búfer (esto es normal por lo que he leído ya que DrawArrays no usa índices? ¿O estoy equivocado aquí?). El problema es que si trato de usar los accidentes glDrawElements todo con:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x000000003150ebbc
Crashed Thread: 0
Thread 0 Crashed:
0 com.apple.GeForce8xxxGLDriver 0x1a3e7050 gldGetTextureLevel + 743600
1 com.apple.GeForce8xxxGLDriver 0x1a3e7563 gldGetTextureLevel + 744899
2 GLEngine 0x1a206eee gleDrawArraysOrElements_VBO_Exec + 1950
Ahora estoy lo que me estoy perdiendo aquí? Por lo que puedo entender, ¿probablemente estoy pasando un puntero malo en alguna parte? Tenga en cuenta que incluso si trato de usar glDrawElements (tipo, 24, GL_UNSIGNED_INT, 0) aún se bloquea, aunque el número de triángulos definidos es mucho mayor, así que no creo que tenga nada que ver con el tamaño.
Saludos, Bogdan
EDIT: Ok por lo que ahora que he hecho algunas comprobaciones adicionales y aquí es mi situación actual: He cambiado las len (triángulos) para ADT.byteCount, no hay solución todavía. Así que revisé todos los datos que recibía y es así: la matriz de vértices contiene ~ 60000 * 3 = 180000 entradas de vértices de tipo GL_Float, al igual que la matriz normal. Como solo hay < 62535 vértices, estoy usando un corto sin signo para los triángulos. Así que tengo len (triángulos) es ~ 135000. También he cambiado los glDrawElements (GL_TRIANGLES, len (self.triangles), GL_UNSIGNED_SHORT, 0). También he verificado y todos los datos de la matriz de triángulos están entre 0 y 62534, ya que pensaba que tal vez algún índice que está fuera de rango deslizado. ¿Qué más podría estar mal aquí? ¿Cómo funciona glDrawElements (GL_POINTS, ...)? ¿También necesita algún tipo de índices?
Edit2 He actualizado el código anterior y como se ha dicho allí, ahora dibujar elementos empates mis GL_POINTS, pero no estoy seguro de dónde se pone índices? ¿O no son necesarios en caso de GL_POINTS? Y para las GL_TRIANGLES, funciona de esta manera, con glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles) comentado, pero nuevamente, ¿qué tipo de índices toma aquí ahora que el elemento buffer está enlazado a 0?! Y otra cosa es que glDrawElements no dibujará todos los puntos que glDrawArrays tiene. Para una mejor explatin:
glDrawArrays(GL_POINTS, 0, len(self.vertices));
Esto atrae a todos mis puntos correctamente:
glDrawElements(type, len(self.vertices), GL_UNSIGNED_SHORT, 0)
Esto parece atraer visiblemente mucho menos puntos que glDrawArrays. Ahora, lo curioso es que si paso algo como 10 * len (self.vertices) para dibujar elementos dibujará todos los puntos (algunos tal vez dos o más, ¿puedo verificar esto?) Pero ¿no se supone que se cuelga?
Regards
Edit3
Algo de información más precisa sobre las matrices:
vértices - una serie de flotadores,
len (vértices) = 180000 byteCount (vértices) = 720000
triángulos - una matriz de numpy.uint16
len (triángulos) = 353439 byteCount (triángulos) = 706878 min (triángulos) = 0 max (triángulos) = 59 999, por lo que deben estar apuntando a los vértices válidos
se realiza el dibujo:
glDrawElements (GL_TRIANGLES, len (self.triangles), GL_UNSIGNED_SHORT, 0)
ACTUALIZACIÓN
Ok justo cuando me enseñó que tengo cómo debería funcionar, he tratado de saltar la VBO de los elementos y se fue apenas:
glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, ADT.voidDataPointer(self.triangles))
Ahora no sólo funciona esto y señala a todos mis triángulos perfectamente, pero el FPS es mejor. ¿No debería el VBO ser más rápido? Y lo que podría hacer que el enfoque anterior para trabajar, pero el siguiente a la caída:
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles)
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, ADT.arrayByteCount(triangles), ADT.voidDataPointer(triangles), GL_STATIC_DRAW_ARB)
glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, 0)
Sí, utilizar glBufferDataARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 4 * len (triángulos), ADT.voidDataPointer (triángulos), GL_STATIC_DRAW_ARB). Remplace "4" por el equivalente de Python de sizeof (unsigned int) – Calvin1602
Ok, gracias, pero cuando lo intento así, me da un accidente allí mismo. ¿Hay algún tamaño máximo para ese buffer? Actualmente estoy teniendo la longitud de triángulos en 353439 y eso da 1413756 para el recuento de bytes. ¿Se supone que debe causar un bloqueo? – Bogdan
Ignora mi último comentario. Lo miraré más de cerca y regresaré. – Bogdan