2010-09-08 8 views
25

Donc, je suis à un point que je devrais commencer à allumer mes modèles de couleurs plates. L'application de test est un cas de test pour la mise en œuvre des méthodes les plus récentes. Je me suis donc rendu compte qu'idéalement, elle devrait implémenter le lancer de rayons (puisque théoriquement, cela pourrait être idéal pour les graphiques en temps réel).Comment faire ray tracing dans OpenGL moderne?

Mais par où commencer?

Supposons que je n'ai jamais fait d'éclairage dans l'ancien OpenGL, donc j'irais directement aux méthodes non-obsolètes.

L'application a actuellement correctement configuré les objets de vertex buffer, vertex, normal et couleur et elle dessine et transforme correctement les modèles dans l'espace, dans une couleur plate.

Existe-t-il une source d'informations qui prendrait un des sommets de couleur plat à tout ce qui est nécessaire pour un résultat final correct via GLSL? Idéalement, avec toutes les autres méthodes d'éclairage supplémentaires qui pourraient être nécessaires pour le compléter.

Répondre

24

Je ne conseillerais pas d'essayer le lancer de rayon réel dans OpenGL parce que vous avez besoin de beaucoup de hacks et de trucs pour cela et, si vous me demandez, il n'y a plus aucun intérêt à le faire. Si vous voulez faire un lancer de rayon sur GPU, vous devriez aller avec n'importe quel langage GPGPU, comme CUDA ou OpenCL, car cela rend les choses beaucoup plus faciles (mais encore, loin d'être trivial).

Pour illustrer le problème un peu plus loin: Pour le raytracing, vous devez tracer les rayons secondaires et tester l'intersection avec la géométrie. Par conséquent, vous avez besoin d'accéder à la géométrie de façon intelligente à l'intérieur de votre shader, mais à l'intérieur d'un fragment shader, vous ne pouvez pas accéder à la géométrie, si vous ne la stockez pas dans une texture. Le vertex shader ne vous fournit pas non plus cette information de géométrie en mode natif, et les shaders de géométrie ne connaissent que les voisins, donc le problème commence déjà. Ensuite, vous avez besoin de structures de données d'accélération pour obtenir des débits d'image raisonnables. Cependant, traverser par ex. Un Kd-Tree à l'intérieur d'un shader est assez difficile et si je me souviens bien, il y a plusieurs articles sur ce problème. Si vous voulez vraiment suivre cette voie, il y a beaucoup de documents sur ce sujet, il ne devrait pas être trop difficile de les trouver. Un traceur de rayons nécessite des modèles d'accès et une mise en cache extrêmement bien conçus pour atteindre une bonne performance. Cependant, vous n'avez que peu de contrôle sur ces GLSL à l'intérieur et l'optimisation des performances peut être très difficile.

Un autre point à noter est que, au moins à ma connaissance, le tracé de rayons en temps réel sur les GPU est principalement limité aux scènes statiques, par exemple. Les kd-trees ne fonctionnent (bien) que pour les scènes statiques. Si vous voulez avoir des scènes dynamiques, vous avez besoin d'autres structures de données (par exemple BVH, iirc?) Mais vous devez constamment les conserver. Si je n'ai rien oublié, il y a encore beaucoup de recherches en cours sur cette question.

+4

Btw: google scholar est votre ami sur ce genre de choses. Qu'en est-il de http://scholar.google.de/scholar?q=glsl+ray+tracing – zerm

+3

OpenCL c'est ... –

+0

Que voulez-vous dire par "structure de données d'accélération"? – bluejamesbond

18

Vous pouvez être déroutant certaines choses.

OpenGL est un rasterizer. Le forcer à faire du ray-tracing est possible, mais difficile. C'est pourquoi raytracing n'est pas "idéal pour les graphiques en temps réel dans quelques années". Dans quelques années, seuls les systèmes hybrides seront viables.

Ainsi, vous avez trois possibilités.

  • Traçage de rayon pur. Rendez seulement un quad fullscreen, et dans votre fragment shader, lisez votre description de scène emballée dans un tampon (comme une texture), traversez la hiérarchie, et calculez des intersections de triangles de rayons.
  • Raytracing hybride. Pixellisation de votre scène de la manière normale, et utiliser raytracing dans votre shader sur certaines parties de la scène qui en a vraiment besoin (réfraction, ... mais il peut être simultané en rasterisation)
  • Rastérisation pure. Le fragment shader fait son travail normal.

Que voulez-vous exactement? Je peux améliorer la réponse en fonction de vos besoins.

Quoi qu'il en soit, this SO question est fortement liée. Même si cette implémentation particulière a un bug, c'est définitivement le chemin à parcourir. Une autre possibilité est openCL, mais le concept est le même.

Questions connexes