Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 13, 2025 14:53

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Mirror Implementation
BeitragVerfasst: Sa Jun 05, 2004 14:33 
Offline
DGL Member

Registriert: Do Mai 13, 2004 16:36
Beiträge: 116
Wohnort: Deutsch-Wagram (Österreich)
Hi!
Mir bekannte Möglichkeiten:
1. Stencil Mirrors
2. CubeMaps
3. SphereMaps
4. Shader
5. Render to Texture

Ich halte Render to Texture für das beste (den Shader würde ich eher schwer schaffen), aber wie setze ich die Werte für gluPerspective? (Es sollte schon so sein, dass man, wenn man am Mirror vorbeigeht auch gespiegelt wird, also dynamisch)[/pascal]

_________________
Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 05, 2004 19:27 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
http://www.delphigl.com/script/do_show.php?name=mirror&action=2

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 05, 2004 19:35 
Offline
DGL Member

Registriert: Do Mai 13, 2004 16:36
Beiträge: 116
Wohnort: Deutsch-Wagram (Österreich)
Hab ich schon gelesen.
Das ist aber nur ein Weg.
Ich will wissen, was ihr von den einzelnen Möglichkeiten haltet.
Sorry für die schlechte Formulierung.

Ääh und RenderToTexture ist wohl doch keine so gute Idee, das schaut dann aus wie ein Foto oder PC-Bildschirm, also 2D.

_________________
Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 05, 2004 20:03 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Na gut, also RendertoTexture hat einmal den Nachteil, den du genannt hast und außerdem hat das Ding eine feste Auflösung und wird sozusagenn nicht "In der Szene" gerendert.

Soweit ich jetzt informiert bin sind Cube und SphereMaps mehr für reflektierende Körper anstatt für planare Spiegel gedacht.

Ich denke, dass der Stencil Buffer die beste Lösung ist, weil sie auch auf älteren GraKa's funzt.

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 05, 2004 20:05 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
RTT brauch man für Spiegel mit Shadern und ist die qualitativ beste Möglichkeit bei flachen Spiegel, wie z.B. eine Wasseroberfläche. Das geht genauso wie die Spiegel mit Stencilbuffer, nur das man das Spiegelbild in eine Texture rendert und keinen Stencil Buffer braucht.
Die andere Alternative sind Cubemaps, obwohl sie nie korrekt sind, und für gekrümmte Oberflächen die einzige gute Möglichkeit.
Cubemaps sind relativ billig und können auch so wie bei UT2004 ganz statisch vorberechnet sein ohne das die Qualität sehr darunter leidet.
Shader kann man unanhängig von den beiden Techniken einsetzen. Ohne Shader bringt RTT nicht sehr viel, außer daß transparente Spiegel leichter zu machen sind.
Das Hauptproblem bei RTT und der Stencil Methode ist, daß man von einer gespiegelten Position aus rendern muß, die sich je nach Level nicht unbedingt an einer günstigen Position befindet, so daß man dort noch zusätzlichen Aufwand bei der Levelverwaltung hat. Cubemap Spiegel kann man dagegen ohne weiteren Aufwand auf beliebige Flächen legen und daher sind Cubemaps einfacher und flexibler, aber eben nicht immer brauchbar.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 05, 2004 20:33 
Offline
DGL Member

Registriert: Do Mai 13, 2004 16:36
Beiträge: 116
Wohnort: Deutsch-Wagram (Österreich)
Hm ich habe da noch ein Verständnisproblem mit den Clipping Planes.
Wenn mein (Stencil) Spiegel auf 0, 3, -10 liegt, muss ich dann die Clipping Plane trotzdem auf 0, 0, -1, 0 setzen? Also ich verstehe das so: Die Plane lässt nur das heil, was auf der negativen z-Seite von ihr liegt. Gibt es da irgendeine ausführlichere Erklärung? :oops:

_________________
Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 06, 2004 11:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenn du deine Clipping-Plane an einer anderen Position haben willst, oder rotieren musst, dann darfst du das nicht über die Paramter für diese machen, sondern musst die ganz einfach wie eine OpenGL-Primitive an die passende Stelle schieben :

Code:
  1. const
  2.  ClipPlane : array[0..3] of Double = (0, 0, -1, 0);
  3. ...
  4. glPushMatrix;
  5.  glTranslatef(...);
  6.  glRotatef(...);
  7.  glEnable(GL_CLIP_PLANE0);
  8.  glClipPlane(GL_CLIP_PLANE0, @ClipPlane);
  9. glPopMatrix


P.S. : Wenn du vorhast Shader zu nutzen, dann lass das mit den Stencilspiegeln und nutz RTT für die Spiegel. Denn bei Stencilspiegeln kannst du logischerweise nicht deren Aussehen per Shader manipulieren. Ausserdem (siehe Tut) muss man bei Stencilschatten aufpassen das nix dahinterliegt, oder um das zu umgehen testen ob der Spiegel sichtbar ist und diesen nur dann rendern (am besten über Occlusio-Queries).

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 06, 2004 11:39 
Offline
DGL Member

Registriert: Do Mai 13, 2004 16:36
Beiträge: 116
Wohnort: Deutsch-Wagram (Österreich)
Ok, aber bei RTT:
Wie soll ich das verwenden?
Den Betrachter an die Spiegelposition verschieben und dann die negativen Rotationswerte des "eigentlichen" Betrachters verwenden? Und wie stimme ich dabei die Werte für gluPerspective ab?

_________________
Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 06, 2004 12:13 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Man kann auch ganz ohne Stencil Buffer Spiegel wie bei Quake3 machen. Dabei ist es egal was hinter dem Spiegel liegt.
Man rendert zuerst das Spiegelbild mit aktivierter Clipplane und gespiegelter Kamera.
Dann löscht man den ZBuffer wieder und zeichnet im normalen Modus eine Fläche an die Stelle des Spiegel. Dabei kann man auch Blending benutzen oder für klare Spiegel nur den ZWert schreiben.
Danach rendert man die Szene normal.

Die ClipPlane entspricht der Ebene der Fläche die spiegeln soll. Man muß alle vier Werte noch mit -1 multiplizieren. Das kommt drauf an wie die Ebenen gespeichert sind.

Wenn man bei der Kamera die Position, den Richtungsvektor und den Vektor nach oben hat, dann addiert man erstman die Position zu den drei Vektoren, spiegelt danach die drei Punkt und subtrahiert dann die gespiegelte Position wieder. Hier http://www.delphi3d.net/articles/viewar ... ortals.htm ist das auch nochmal erklärt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 06, 2004 13:18 
Offline
DGL Member

Registriert: Do Mai 13, 2004 16:36
Beiträge: 116
Wohnort: Deutsch-Wagram (Österreich)
Hey :!:
Das ist ja eine super Idee!
Die heisst Clip Mirrors, oder? 8)
Die Performance sollte besser sein als die beim Stencil Mirror, weil:
1. Nur 2 Renderpasses
2. Damit ein Pixel durch den Stencil Test fällt, muss er trotzdem durch die Pipeline.
Lieg ich damit richtig?
Also geht das Rendern so:
1. Leere Color- und Depth-Buffer.
2. Mach' die Clipping Plane.
3. Rendere die skalierte Welt.
4. Leere den Depth-Buffer.
5. Rendere die Spiegelfläche.
6. Rendere den Rest.
Aber wenn ich mehrere Spiegel habe? Kann es da nicht zu Komplikationen kommen?

_________________
Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 06, 2004 13:35 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Bei Quake3 ist es in der Tat so, daß alle sichtbaren Spiegel zusammengefaßt werden. In dem ersten Level kann man z.B. nie gleichzeitig durch das Portal und den Spiegel sehen. Wie die Technik heißt weiß ich nicht.
Vermutlich ist das die beste Technik, wenn man es ohne Shader oder RTT haben will. Eine Lightmap kann man ja trotzdem noch auf den Spiegel legen, oder mit einer AlphaMaske nur bestimmte Teile der Fläche spiegeln lassen. Wer errinert sich noch an den Screenshot mit dem zerbrochenen runden Spiegel mit dem Quake3 Logo an der Wand auf einem der ersten Bilder zu Quake3?
Anstelle des StencilBuffers kann man auch Clipplanes nehmen um das Rendering auf bestimmte Flächen zu beschränken. Dann rendert man erst alle Spiegel und dann die normale Szene. Ich bezweifele aber daß 5 Clipplanes schneller als der Stencilbuffer sind, weil der StencilBuffer heutzutage sehr gut optimiert ist.
Bei Unreal1 gibt es auch bis zu 8 Spiegel im Spiegel. Da das sogar auf Voodoo1 Karten ohne Stencil Buffer lief, wird hier wurde hier wohl mit Clipplanes gearbeitet. Das sind aber alles nur selten genutze Effekte und es ist vor allem wichtig, dass der häufigste Fall, nämlich ein Spiegel/Portal ordentlich schnell läuft.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 06, 2004 16:11 
Offline
DGL Member

Registriert: Do Mai 13, 2004 16:36
Beiträge: 116
Wohnort: Deutsch-Wagram (Österreich)
Hm...
Ich werde mal ein paar Versuchsprogramme schreiben und experimentieren.
Aber zu RTT und gluPerspective: wäre der untenstehende Code korrekt? Ich meine, auch sinvoll (rechteckige) Spiegel?
Code:
  1. gluPerspective(45, SpiegelBreite/SpiegelHoehe, 1, 1000);

_________________
Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 07, 2004 18:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Du solltest drauf achten das dein FOV für das RTT das selbe ist wie das FOV das du fürs normale Rendering der Szene nutzt, aber ansonsten kann man die obigen Einstellungen ruhig nehmen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 07, 2004 19:31 
Offline
DGL Member

Registriert: Do Mai 13, 2004 16:36
Beiträge: 116
Wohnort: Deutsch-Wagram (Österreich)
LOL!
Jetzt krieg ich nicht mal normales RTT hin!
Der Bildschirm ist schlicht und einfach schwarz.
Hier mal Code:

EDIT: Das Problem ist gelöst, daher habe ich den Code aus Gründen der Länge des Threads entfernt. Wer ihn unbedingt haben will, der kann sich das Tutorial 'Die Welt daneben' anschauen.

Die Textur wird sicher erstellt, in der Displaylist habe ich eine andere Farbe gehabt, weil die Textur noch gebindet war.

_________________
Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)


Zuletzt geändert von @uzingLG am Mo Jun 07, 2004 20:06, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 07, 2004 19:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Sicher dass die Einstellungen hier auch ein korrektes Bild liefern : ?
Code:
  1. gluLookAt(0, 0, -3, 0, 0, -4, 0, 1, 0);
  2.   glTranslatef(0, 0, -6);

Setz mal die Löschfarbe auf Rot oder so und dann siehst du ja obs an obigen Parametern (sprich : komplett rote Textur) liegt.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]