Comment faire le traçage des rayons dans OpenGL moderne?

donc je suis à un point où je devrais commencer à allumer mes modèles de couleur plate. L'application de test est un cas de test pour la mise en œuvre de seulement les dernières méthodes, donc j'ai réalisé qu'idéalement il devrait être mise en œuvre ray tracing (depuis théoriquement, il pourrait être idéal pour les graphiques en temps réel dans quelques années).

mais par où commencer?

supposer que je n'ai jamais fait l'éclairage dans le vieux OpenGL, donc je serais aller directement à des méthodes non-dépréciées.

l'application a actuellement correctement mis en place des objets tampons vertex, vertex, entrée normale et couleur et il dessine et transforme correctement les modèles dans l'espace, dans une couleur plate.

y a-t-il une source d'information qui prendrait un des sommets de couleur plate à tout ce qui est nécessaire pour un résultat final approprié via GLSL? Idéalement, avec toute autre méthode d'éclairage supplémentaire qui pourrait être nécessaire pour la compléter.

28

2 réponses

Je ne conseillerais pas d'essayer le traçage de rayons réel à 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 un point à faire cela du tout. Si vous voulez faire du tracing ray sur GPU, vous devriez utiliser N'importe quelle langue GPGPU, comme le CUDA ou L'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 raytracing, vous avez besoin de tracer les rayons secondaires et de tester pour intersection avec la géométrie. Par conséquent, vous avez besoin d'accéder à la géométrie d'une manière intelligente à l'intérieur de votre shader, mais à l'intérieur d'un shader fragment, vous ne pouvez pas accéder à la géométrie, si vous ne la stockez pas "codée" dans une texture. Le vertex shader ne vous fournit pas non plus cette information de géométrie nativement, et les shaders de géométrie ne connaissent que les voisins donc ici le problème commence déjà. Ensuite, vous avez besoin de structures de données d'accélération pour obtenir des cadences raisonnables. Cependant, traverser par exemple, un arbre de Kd à l'intérieur d'un shader est assez difficile et si je me souviens bien, Il ya plusieurs documents uniquement sur ce problème. Si vous voulez vraiment aller dans cette voie, bien que, il ya beaucoup de papiers sur ce sujet, il ne devrait pas être trop dur à trouver.

un traceur de rayon nécessite des modèles d'accès et de 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 de la performance peut devenir vraiment difficile.

un autre point à noter est que, au moins à ma connaissance, le traçage des rayons en temps réel sur les GPUs est principalement limité aux scènes statiques parce que par exemple les arbres kd 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 BVHs, iirc?) mais vous devez constamment maintenir ceux. Si je n'ai rien manqué, il y a encore beaucoup de recherches en cours sur cette question.

27
répondu zerm 2010-09-08 11:44:19

vous pouvez confondre certaines choses.

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

donc, vous avez trois possibilités.

  • pur raytracing. Afficher seulement un quad en plein écran, et dans votre shader de fragment, lire la description de votre scène empaquetée dans un tampon (comme une texture), traverse la hiérarchie, et calcule les intersections ray-triangles.
  • Hybride raytracing. Pixelliser votre scène de manière normale, et l'utilisation de raytracing dans votre shader sur certaines parties de la scène qui nécessite vraiment (réfraction, ... mais il peut être simulé en trastérisation)
  • rastérisation Pure. Le shader de fragment fait son travail normal.

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

de toute façon, cette question est fortement liée. Même si cette implémentation particulière a un bug, c'est définitivement la voie à suivre. Une autre possibilité est openCL, mais le concept est le même.

20
répondu Calvin1602 2017-05-23 12:34:33