2010-01-27 15 views
0

J'essaye de dessiner plusieurs lignes sur l'écran en même temps en utilisant des bandes de lignes OpenGL et les performances sont lentes, et il a été suggéré d'utiliser un vertex buffer. Je suis nouveau dans les buffers de vertex - ai-je besoin d'un nouveau pour chaque ligne que je veux dessiner, ou est-ce que j'utilise un seul tampon pour toutes les lignes (elles ne sont pas nécessairement connectées les unes aux autres)? À ce stade, j'ai une liste de lignes (où chaque ligne est une liste de sommets), mais je ne sais pas comment les rendre rapidement. Toute aide serait appréciée.Dessin au trait Java OpenGL avec des tampons de vertex

EDIT: Voici mon code actuel qui donne une exception: EDIT2: Rembobiner le tampon avant d'appeler glVertexPointer a corrigé l'exception puisque le put faisait avancer le tampon. Ceci est maintenant corrigé.

java.lang.IndexOutOfBoundsException: Required 1 remaining elements in buffer, only had0 
at com.sun.gluegen.runtime.BufferFactory.rangeCheck(BufferFactory.java:247) 
at com.sun.opengl.impl.GLImpl.glVertexPointer(GLImpl.java:27937) 

    for (int i = 0; i < lines.size(); i++) 
    { 
     List<Vertex> v = lines.get(i); 
     DoubleBuffer buf = BufferUtil.newDoubleBuffer(v.size() * 3); 

     Iterator<Vertex> iter = v.iterator(); 
     while (iter.hasNext()) 
     { 
      Vertex vt = iter.next(); 
      buf.put(new double[] { vt.x, vt.y, vt.z }); 
     } 
     gl.glVertexPointer(3, GL.GL_DOUBLE, 0, buf); 
     gl.glEnableClientState(GL.GL_VERTEX_ARRAY); 
     gl.glDrawArrays(GL.GL_LINES, 0, v.size()); 
     gl.glDisableClientState(GL.GL_VERTEX_ARRAY); 
    } 

Espérons que cela fournira une meilleure idée de mon problème (je sais que ce code a des problèmes, en essayant d'apprendre ici bien).

Merci, Jeff

Répondre

0

Je suis aussi un débutant opengl, et ne connaissent pas les liaisons java, mais je vais essayer de vous orienter dans la bonne direction jusqu'à ce qu'une meilleure réponse se présente. Pour autant que je sache, il n'y a qu'un seul tampon vertex. Vous pouvez rendre directement au vertex buffer avec les données côté client. Si vous voulez faire cela, examinez les appels comme glEnableClientState (GL_VERTEX_ARRAY), glBindBuffer, glVertexPointer, glDrawElements. Vous devrez également écrire dans le tableau d'index. Selon le site opengl, ces appels sont maintenant dépréciés en faveur des objets tampons Vertex. Je ne sais pas grand-chose à leur sujet, mais d'après votre question, c'est ce que les gens proposaient pour vous. Ils sont assez bien expliquées avec le code exemple ici:

http://www.opengl.org/wiki/Vertex_Buffer_Objects

En ce qui concerne vos problèmes de performance, il semble étrange que vous obtiendriez des problèmes que de bandes de ligne. Je voudrais également vérifier si vous avez les bons pilotes opengl pour votre carte vidéo, ou peut-être essayer une langue maternelle comme C++ au lieu de Java.

+0

non, il n'y a pas de "seul" tampon de vertex. Vous pouvez en avoir autant que vous voulez. Vous ne "rendez" pas les VBO, vous les remplissez avec glBufferData et/ou glBufferSubData. vous renvoyez aux données par décalage dans un vbo avec glBindBuffer + glVertexPointer, et utilisez réellement les données sur le Draw consécutif. VBOs _are_ buffers de vertex. – Bahbar

0

Les tampons vertex ne sont que de la mémoire allouée et gérée par le GL. En tant que tels, ils ne sont pas directement liés aux tirages.

Maintenant, oui, stocker les données de vertex directement dans GL peut améliorer les performances si ces données ne changent pas beaucoup (cela évite d'avoir à transférer les données à chaque image).

Votre question n'est cependant pas très quantitative. Que voulez-vous dire par «c'est lent»? Combien de lignes voulez-vous dessiner? combien d'appels téléphoniques effectuez-vous actuellement? Quel genre de performance obtenez-vous? Quels types de lignes dessinez-vous?

Il est difficile de dessiner rapidement plusieurs bandes de lignes, car elles nécessitent chacune un appel de dessin séparé. Cependant, il est possible avec GL_LINES de grouper plusieurs lignes dans le même tirage. Et cela devrait nettement mieux fonctionner.

Modifier pour ajouter:

Ok, je regardais votre code ... Je ne suis pas familier avec GL en Java, mais que le code semble suspect en ce qu'elle ne passe pas à BUF VertexPointer. Il passe v? Aussi, votre put semble suspecté. N'êtes-vous pas censé pousser des doubles plutôt qu'un double tableau?

+0

Désolé pour l'imprécision. J'essaie d'utiliser GL_LINES comme indiqué dans mon édition ci-dessus, mais je n'arrive pas à le faire fonctionner. –

+0

Oui, vous avez raison. c'était un type-o. Le code fonctionne maintenant. Je l'utilise avec NASA WorldWind, mais le rendu est encore très lent. Je ne suis pas sûr si cela est lié à WorldWind ou OpenGL ... –