2011-05-27 1 views
0

J'ai finalement atteint le point que je peux ajouter de la couleur à mes sommets. Mais maintenant je veux améliorer mon taux de FPS. Voici la situation actuelle. J'ai un grand nombre de sommets (~ 200000), et chacun d'eux peut être dans l'une des ~ 150 classes. Chaque classe est différenciée par sa couleur. Je dessine actuellement mes sommets comme:glColorPointer essayant d'améliorer fps

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)  
    glEnableClientState(GL_COLOR_ARRAY) 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferColors) 
    glColorPointer(3, GL_FLOAT, 0, None) 
    glDrawArrays(GL_POINTS, 0, len(self.vertices)/3) 

Tout fonctionne bien et le FPS est ~ 60. Tous mes tampons sont générés uniquement au moment de l'initialisation. Mais maintenant, les couleurs qui représentent chaque classe changeront rapidement, une fois toutes les millisecondes environ. Avec ça les couleurs changeront aussi donc je devrais recréer mon buffer couleur pour chaque tirage, et pour 200000 vertices j'ai l'impression que le FPS sera proche de 0. Le correctif que j'essaye de mettre en place est de garder une couleur fixe buffer, mais au lieu des couleurs réelles, ils conserveraient un pointeur sur la classe qu'il représente. De cette façon, seules les 200 couleurs des classes vont changer. Le problème est que je ne sais pas comment cela pourrait être implémenté dans OpenGL. Est-ce faisable? Des pointeurs sur la façon de faire cela?

Répondre

2

Au lieu de couleurs, les classes doivent définir une coordonnée de texture 1D, puis au lieu de changer cet énorme jeu de données, vous devez remplacer seulement des parties de la texture. Pour éviter l'interpolation d'échantillonnage de texture, définissez la texture dans le mode de filtrage GL_NEAREST et échantillonnez la texture dans le vertex shader par sommet (c'est-à-dire, pas d'échantillonnage de texture par fragment comme vous le feriez habituellement).

+0

Merci pour les gars d'entrée. Je vais essayer vos suggestions. – Bogdan

0

Je pense que vous devriez sérieusement regarder les shaders. Vous ne devriez pas avoir besoin de recréer votre tampon à chaque fois. http://en.wikipedia.org/wiki/GLSL. Les shaders utiliseront votre tampon pour effectuer toutes sortes d'opérations en couleur et en géométrie.