2017-01-26 2 views
1

J'essaie de rendre d'énormes nuages ​​de points (~ 150M) mais OpenGL n'en rend qu'une partie (~ 52M). Lors du rendu de jeux de données plus petits (< 40M) tout fonctionne bien. J'utilise un seul VBO. Lorsque vous utilisez plusieurs VBO, les points sont rendus mais le rendu est terriblement lent, ce qui est attendu. Mon élément a une taille de 44 octets et GPU a 3 Go de mémoire disponible. Cela devrait suffire pour près de ~ 70M points mais je peux rendre jusqu'à 100M points avec plusieurs VBO. Y at-il une limitation spécifique OpenGL par VBO dont je ne suis pas au courant?.glDrawArrays ne restitue pas le nuage de points entier

glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, cloud.size() * sizeof(Point), cloud.data(), GL_STATIC_DRAW); 
// lot of other code 
glDrawArrays(GL_POINTS, 0, cloud.size()); 
+0

Vous n'appelez pas glBufferData à chaque image, n'est-ce pas? –

+0

Vérifiez-vous que 'glBufferData()' ne définit pas l'état d'erreur sur GL_OUT_OF_MEMORY'? – genpfault

+0

Je ne suis pas. Ceci est juste du pseudo code. En fait, j'utilise un drapeau sale pour mettre à jour le tampon uniquement lorsque les données changent. – mitjap

Répondre

6

Il ressemble à une partie de votre système utilise des entiers non signés 32 bits pour stocker la taille des tampons, passant ainsi 148M*44bytes déversoirs et se convertit à environ 54.9M ou 50.4M selon que vos méga-octets sont binaires ou décimal . Je commencerais par vérifier votre bibliothèque de liaison OpenGL pour voir que les prototypes qu'elle déclare correctement utilisent des types 64 bits. Si c'est le cas, le bug doit être dans les pilotes OpenGL.

Pour transférer plus de données de 4 Go au tampon que vous pouvez essayer d'utiliser l'une des autres fonctions disponibles: glBufferSubData et glBufferStorage ou mémoire tampon carte avec glMapBufferRange, ce qui pourrait contourner la limitation de 4 Go.

Une autre chose à considérer est d'utiliser un VAO mais de diviser les données entre plusieurs tampons. Vraisemblablement votre Point se compose de différents attributs, comme la position, la couleur, etc ... Vous pouvez placer chacun d'eux dans un tampon séparé et toujours utiliser un VAO et un appel draw. Vous pouvez également optimiser les types d'attributs que vous utilisez (par exemple, n'utilisez pas de flottants lorsque les shorts ou les octets le feraient) et la disposition de la structure (vérifiez qu'il n'y a pas de remplissage inutile entre les champs).

+0

Pour utiliser 'glBufferSubData', je pense que vous devez d'abord appeler' glBufferData' avec la taille désirée (qui est 'GLsizei ') et l'utilisation, puis utilisez' glBufferSubData' pour mettre à jour certaines parties de celui-ci. Est-ce que je comprends bien? Comme pour 'glBufferStorage'. Je pense que cela résoudrait mes problèmes mais je n'ai pas OpenGL 4.4 disponible. Je suppose que je vais devoir utiliser un VBO par 2^32 octets de données. Je vous remercie! – mitjap

+1

Eh bien, 'glBufferSubData' s'attend en effet à ce que la mémoire du buffer soit déjà allouée, ce à quoi sert' glBufferStorage'. Comme vous pouvez le voir par le type qu'ils utilisent, ils sont en effet des fonctions plus récentes. Vous pouvez toujours vérifier si vous avez supporté l'extension 'GL_ARB_buffer_storage' qui a introduit' glBufferStorage'. – ybungalobill

+0

Cette réponse est incorrecte. 'glBufferData' utilise le type' GLsizeiptr' pour le paramètre 'size' qui est explicitement spécifié comme étant' ptrbits', où 'ptrbits' est le nombre de bits utilisés pour les adresses dans l'espace adresse du client. – derhass

0

Je ne pense pas que la mémoire soit un problème en fait je dirais que votre programme fait trop d'appels de dessin. Vous devriez essayer avec glDrawArraysInstanced(). Pour cela, vous devez fournir une nouvelle position pour chaque instance dans le vertex shader ... peut-être que cela va résoudre votre problème: D. Je suis désolé si je ne peux pas vous fournir de détails, mes compétences en OpenGL sont un peu ennuyeuses, mais je prévois de récupérer dès que possible: J'espère que cela aidera.