Bonjour à tous,
Dans le cadre d'un projet, j'ai développé un outil de filtrage d'un nuage de points 3D par une caméra. Je m'explique. J'ai un nuage de points 3D. Ce nuage de points est réparti dans un octree. Je visualise ce nuage de points dans une fenêtre à l'écran. Dans cette fenêtre, en plus du nuage de points, j'affiche aussi une caméra C dont je peux changer la position (translation et rotation). Cette caméra est définie par ses paramètres intrinsèques (normal) ainsi qu'un plan near et far. Une fois sa position définie, je calcule le frustrum de la caméra, puis je calcule l'intersection de l'octree avec le frustrum. Enfin, pour toutes les cellules qui coupent le frustrum, j'extraie les points 3D contenus à l'intérieur. Je ne garde que ceux qui sont à l'intérieur du frustrum (après projection sur le plan focal de la caméra C) et je les colore en rouge pour les distinguer.
Çà marche bien et assez vite (avec mes jeux de données). Seulement, je trouve ça un peu lourd, et j'aimerais faire fonctionner le tout en temps réel (ou du moins, le plus rapidement possible). Je m'interroge donc sur la faisabilité d'une autre méthode que je vous décris ci dessous.
J'aimerais profiter de la rapidité du GPU, plutôt que de faire tous ces tests d'intersection (algorithme Separating Axis Test) sur le CPU. L'idée est de se passer de l'octree. En voilà les deux points principaux :
1. Je dessine dans un framebuffer la scène vue du point de vue de la caméra C (je connais les paramètres extrinsèques et intrinsèques, le plan far et near). Si j'ai bien compris, toutes les étapes de culling...etc seront faites par le gpu et beaucoup plus rapidement (fait par le matériel). A ce point, je me retrouve avec un framebuffer qui contient la projection de tous les points à l'intérieur du frustrum de la caméra C.
2. Même si le tout n'est pas tracé à l'écran, on peut quand même activer un zbuffer (par exemple) pour le framebuffer (je l'ai déjà fait dans un autre projet). De la même manière que le zbuffer contient la profondeur des points tracés, est-il possible d'activer un autre type de buffers (dans les versions plus récentes d'OpenGL) qui contiendrait l'indice des points tracés ? Cela me permettrait alors de lire simplement les pixels du framebuffer et de récupèrer les indices des points. On m'a dit qu'avec OpenGL 3 ou 4 (je ne sais plus exactement), il était possible d'associer des valeurs aux points 3D (dans mon cas, ce serait l'indice dans le nuage de points), et de récupérer ces valeurs pour les points tracés à l'écran.
(Ensuite, dans un deuxième temps, il faudrait aussi gérer le cas où plusieurs points se projettent sur le même pixel...)
Je ne sais pas si c'est très très clair. Ce deuxième point ne me paraît pas évident mais je suis sûr qu'il y a un moyen de remonter à l'indice des points affichés (avec des shaders ? Opengl 4 ?... ?). Si quelqu'un a une idée !
Merci d'avance
Bonne journée
JS
Partager