Comment rendre un miroir ou d'autres surfaces réfléchissantes?

16

Je me demandais juste comment créer un miroir dans un jeu 3D? Ma suggestion est / était de tracer des rayons, de frapper l'objet "miroir" puis de dessiner une image d'une seconde came sur l'objet "miroir" qui est situé au "point" miroir de la caméra d'origine en utilisant le côté frappé de l'objet miroir comme plan miroir.

Il faudrait utiliser le rayon unique provenant du centre de la caméra d'origine pour déterminer le point où se situe le centre de la vision sur le plan du miroir.

daemonfire300
la source
1
Aimeriez-vous avoir un croquis / dessin de "comment je voulais dire" cette chose?
daemonfire300
Vous pouvez essayer de publier ceci sur stackoverflow.com car ce n'est pas directement lié au développement du jeu; il y a peut-être plus d'experts graphiques là-bas qui pourraient vous aider.
Ricket

Réponses:

14

Si vous utilisez OpenGL, la section 9 de la FAQ OpenGL: Transformations explique exactement comment procéder. Et non, cela n'implique pas le lancer de rayons, car c'est naturellement une façon très inefficace (mais de haute qualité) d'y parvenir.

9.170 Comment rendre un miroir?

Voici essentiellement ce que dit la FAQ, et l' exemple de code le montre:

  • Configurez une matrice de vue réfléchie. Cette opération pour les miroirs alignés sur l'axe est expliquée dans le deuxième paragraphe.
  • Dessinez la scène
  • Restaurer la matrice de vue et effacer le tampon de profondeur
  • Rendez la scène à nouveau; la géométrie réelle du miroir dans cette scène doit être translucide ou entièrement transparente, afin de montrer la scène miroir précédemment rendue.

De toute évidence, il y a beaucoup de place pour l'optimisation. Lors du rendu de la scène réfléchie, vous devez probablement autant d'élimination que possible, car les miroirs sont généralement de petite taille et l'élimination par défaut hors écran ne se déclenchera pas pour la géométrie qui est à l'écran mais pas vue à travers le miroir. Vous pouvez également restituer juste une version simplifiée de la scène à travers le miroir. Pour les effets et pour empêcher l'utilisateur de remarquer la qualité réduite, vous pouvez appliquer un shader (par exemple flou, ou peut-être clair / délavé) lorsque vous effectuez votre rendu en miroir.

J'imagine que si vous utilisez DirectX, la procédure serait sensiblement la même.

Ricket
la source
3
Une alternative, si vous avez plus de mémoire que de temps de rendu, consiste simplement à refléter la géométrie de votre monde à travers le miroir dans votre éditeur 3D, puis vous pouvez le modifier pour qu'il vous ressemble (appliquer des niveaux de mip inférieurs, etc.). Nous l'avons fait sur la PS1, où des trucs assis sur un sol brillant étaient dupliqués / inversés sous terre, et le sol lui-même était rendu semi-transparent.
dash-tom-bang
Notez que l' exemple de code fait référence à la spécification OpenGL obsolète. Néanmoins, le concept est universel et peut probablement être appliqué de la même manière en utilisant la dernière spécification OpenGL .
patryk.beza