2010-02-18 9 views
3

J'ai un système de particules où les positions et diverses propriétés sont stockées dans un objet tampon vertex. Les valeurs sont continuellement mises à jour par un noyau CUDA. Actuellement, je les rends simplement en utilisant GL_POINTS comme des cercles plats. Ce qui m'intéresse, c'est de rendre ces particules plus impliquées dans des choses comme les modèles d'oiseaux animés en 3D par exemple. J'essaie de comprendre quelle serait la meilleure approche. Pour le plaisir de la conversation disons que l'animation du modèle d'oiseau est composée de 3 cadres (position des ailes et pas)Comment rendre des particules non triviales dans OpenGL

Je peux voir le chargement des modèles dans des listes d'affichage et le bouclage de toutes les particules en translation , en tournant, etc. la matrice appelle alors la liste d'affichage. Cela ne semble pas être une approche idéale car cela nécessiterait de ramener toutes les données de particules à l'hôte depuis le GPU juste pour faire des opérations matricielles à renvoyer au GPU (à moins que je puisse appeler les fonctions de dessin d'un noyau cuda? ?)

Je ne connais pas beaucoup les shaders, seraient-ils capables de gérer quelque chose comme ça? À ce stade, je suis surtout à la recherche de conseils sur la voie à suivre, mais si vous connaissez des articles ou des tutoriels qui traitent du sujet, bravo. Je travaille avec l'OpenGL nativement sur Windows 7 64bit avec C++. Je n'utilise pas GLUT

Répondre

4

Vous souhaitez probablement utiliser: EXT_draw_instanced. Je n'ai jamais réellement utilisé Instancing, mais le GPUS le plus moderne (GF6 et plus je pense) vous permet de donner au GPU un modèle et une liste de points et de le faire dessiner à chaque point.

Je vais google un peu plus d'informations et voir ce que je viens avec ....

Eh bien, c'est la spécification officielle, et on dirait qu'ils ont un tutoriel sur elle.

http://www.opengl.org/registry/specs/ARB/draw_instanced.txt

+0

D'accord. C'est exactement le genre de chose pour laquelle l'instanciation est conçue. – Toji

0

Vous devrez faire preuve de créativité pour faire quelque chose comme ça. Si vous utilisiez CUDA pour calculer une position et une rotation dans 2 textures flottantes à 3 composants, puis un "index" avec chaque sommet et incrémentant de 1 par instance de géométrie, vous pouviez écrire un shader qui charge les textures et utilise la texture vertex shader recherche pour sélectionner le pixel pertinent parmi les 2 textures et construire une matrice de transformation. Vous transformez ensuite les verts du maillage par la matrice de transformation que vous avez construite.