Come si esegue il rendering di uno specchio o di altre superfici riflettenti?


16

Mi chiedevo solo come creare uno specchio in un gioco 3D? Il mio suggerimento è / era di tracciare i raggi, colpire l'oggetto "specchio", quindi disegnare un'immagine di una seconda camma sull'oggetto "specchio" che si trova nel "punto" di specchio della telecamera originale usando il lato colpito dell'oggetto specchio come piano di mirroring.

Dovremmo usare un raggio proveniente dal centro della fotocamera originale per determinare il punto in cui il centro della visione si trova sul piano dello specchio.


1
Ti piacerebbe avere uno schizzo / disegno di "come intendevo" questa cosa?
daemonfire300,

Potresti provare a pubblicarlo su stackoverflow.com poiché non è direttamente correlato allo sviluppo del gioco; forse ci sono più esperti di grafica laggiù che potrebbero aiutarti.
Ricket,

Risposte:


14

Se stai usando OpenGL, la sezione FAQ di OpenGL 9: Transformations spiega esattamente come farlo. E no, non comporta raytracing, in quanto è comprensibilmente un modo molto inefficiente (ma di alta qualità) per ottenere questo risultato.

9.170 Come si esegue il rendering di un mirror?

Ecco essenzialmente cosa dice la voce FAQ e il codice di esempio dimostra:

  • Imposta una matrice di vista riflessa. Questo per gli specchi allineati agli assi è spiegato nel secondo paragrafo.
  • Disegna la scena
  • Ripristina la matrice di visualizzazione e cancella il buffer di profondità
  • Rendi di nuovo la scena; la geometria speculare effettiva in questa scena dovrebbe essere traslucida o completamente trasparente, al fine di mostrare fino alla scena speculare precedentemente renderizzata.

Ovviamente c'è molto spazio per l'ottimizzazione. Quando si esegue il rendering della scena riflessa, è probabile che sia necessario il maggior numero possibile di abbattimenti, poiché gli specchi sono in genere piccoli e l'abbattimento predefinito fuori dallo schermo non si attiva per la geometria che è sullo schermo ma non vista attraverso lo specchio. Puoi anche eseguire il rendering solo di una versione semplificata della scena attraverso il mirror. Per gli effetti e per oscurare l'utente dal notare la qualità ridotta, è possibile applicare uno shader (ad esempio sfocatura o forse brillante / sbiadito) quando si esegue il rendering speculare.

Immagino, se stai usando DirectX, la procedura sarebbe più o meno la stessa.


3
Un'alternativa, se hai più memoria del tempo di rendering, è semplicemente riflettere la geometria del tuo mondo attraverso lo specchio nel tuo editor 3D, quindi puoi modificarla per apparire come vuoi (imponi livelli di mip inferiori, ecc.). Lo abbiamo fatto su PS1, dove le cose su un pavimento lucido sono state duplicate / invertite sottoterra e il pavimento stesso è stato reso semitrasparente.
dash-tom-bang,

Si noti che il codice di esempio si riferisce alla specifica OpenGL obsoleta. Tuttavia il concetto è universale e probabilmente può essere applicato in modo simile usando le più recenti specifiche OpenGL .
patryk.beza,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.