Wie rendere ich einen Spiegel oder andere reflektierende Oberflächen?

16

Ich habe mich nur gefragt, wie man einen Spiegel in einem 3D-Spiel erstellt. Mein Vorschlag ist / war, Strahlen zu verfolgen, das "Spiegel" -Objekt zu treffen und dann ein Bild einer zweiten Kamera auf das "Spiegel" -Objekt zu zeichnen, das sich am Spiegel "Punkt" der Originalkamera befindet, indem die Trefferseite des Spiegelobjekts als verwendet wird Spiegelung der Ebene.

Wir müssten den einen Strahl verwenden, der aus der Mitte der Originalkamera kommt, um den Punkt zu bestimmen, an dem sich der Mittelpunkt der Sicht auf der Spiegelebene befindet.

daemonfire300
quelle
1
Möchten Sie eine Skizze / Zeichnung darüber haben, wie ich dieses Ding gemeint habe?
Daemonfire300
Sie könnten versuchen, dies auf stackoverflow.com zu veröffentlichen, da es nicht direkt mit der Spieleentwicklung zu tun hat. Vielleicht gibt es dort mehr Grafikexperten, die Ihnen helfen könnten.
Ricket

Antworten:

14

Wenn Sie OpenGL verwenden, erfahren Sie in den OpenGL-FAQs in Abschnitt 9: Transformationen genau, wie Sie dies tun. Und nein, es handelt sich nicht um Raytracing, da dies verständlicherweise eine sehr ineffiziente (aber qualitativ hochwertige) Methode ist, um dies zu erreichen.

9.170 Wie rendere ich einen Spiegel?

Hier ist im Wesentlichen, was der FAQ-Eintrag sagt, und der Beispielcode zeigt:

  • Richten Sie eine Matrix für gespiegelte Ansichten ein. Dies für achsgerichtete Spiegel zu tun, wird im zweiten Absatz erklärt.
  • Zeichne die Szene
  • Stellen Sie die Ansichtsmatrix wieder her und löschen Sie den Tiefenpuffer
  • Rendern Sie die Szene erneut. Die tatsächliche Spiegelgeometrie in dieser Szene sollte durchsichtig oder vollständig transparent sein, damit die zuvor gerenderte gespiegelte Szene sichtbar wird.

Offensichtlich gibt es viel Raum für Optimierungen. Wenn Sie die reflektierte Szene rendern, sollten Sie wahrscheinlich so viel wie möglich aussortieren, da die Spiegel normalerweise klein sind und das standardmäßige Aussortieren nicht auf die Geometrie zutrifft, die auf dem Bildschirm angezeigt wird, aber nicht durch den Spiegel gesehen wird. Sie können auch nur eine vereinfachte Version der Szene über den Spiegel rendern. Um Effekte zu erzielen und den Benutzer davon abzuhalten, die verminderte Qualität zu bemerken, können Sie beim Rendern mit Spiegeln einen Shader (z. B. Unschärfe oder Hell / Verwaschen) anwenden.

Ich stelle mir vor, wenn Sie DirectX verwenden, wäre das Verfahren ähnlich.

Ricket
quelle
3
Eine Alternative, wenn Sie mehr Speicher als Renderzeit haben, besteht darin, Ihre Weltgeometrie einfach durch den Spiegel in Ihrem 3D-Editor zu reflektieren. Dann können Sie sie so ändern, wie Sie möchten (niedrigere MIP-Ebenen erzwingen usw.). Wir haben das auf der PS1 gemacht, wo Sachen, die auf einem glänzenden Boden lagen, im Untergrund dupliziert / invertiert wurden und der Boden selbst halbtransparent gemacht wurde.
Dash-Tom-Bang
Beachten Sie, dass sich der Beispielcode auf eine veraltete OpenGL-Spezifikation bezieht. Trotzdem ist das Konzept universell und kann wahrscheinlich mit der neuesten OpenGL- Spezifikation auf ähnliche Weise angewendet werden .
patryk.beza