Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Am Ende der Szene einfach im Orthomodus ein Vollbildquad ohne Textur in schwarz über die Szene legen (vorher Tiefentest deaktivieren bzw. auf GL_ALWAYS setzen) und dann mittels Zeitmessung den Alphawert ansteigen lassen. Ist der auf 1 Vorzeichen umdrehen und Alphawert wieder gegen Null streben lassen. So mach ich das in Projekt "W" auch.
Wenn man sonst den Orthomodus nicht verwendet, reicht es auch nur glDepthFunc(GL_ALWAYS); (wie SaschaWillems schon erklärt hat) zu setzen und dann im Perspektivmodus ein Quad zu zeichnen - so mache ich es.
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
ok ich hab das mal eingebaut, ich zeichne ein Quadrat welches mit der funktion glColor4f(0,0,0,Alpha); schwarz wird und einen Alphawert bekommt ich hab den tiefentest so gestellt wie ihr gesagt habt, aber es wäre glaub ich gut (Auch wenn ich mich informiert habe was der parameter bedeutet) wenn mir das nochmal einer erklären könnt warum genau diese,
aber egal auf welchen wert ich Alpha setzte es kommt immer gleich ganz schwarz, hier mal mein code
Code:
procedure TFadeToBlack.Render; begin if Aktive then begin Visible := true; if Alpha < 1 then Alpha := Alpha + 0.001; end else begin if Alpha > 0 then Alpha := Alpha -0.001 else Visible := false; end;
if Visible then begin glpushmatrix; glDepthFunc(GL_ALWAYS); glenable(GL_Blend); glBegin(GL_QUADS); glColor4f(0,0,0,Alpha); glVertex3f(0,0,Ebene); glColor4f(0,0,0,Alpha); glVertex3f(0,Height,Ebene); glColor4f(0,0,0,Alpha); glVertex3f(Width,Height,Ebene); glColor4f(0,0,0,Alpha); glVertex3f(Width,0,Ebene); glEnd; gldisable(gl_blend); glPopMatrix; end; end;
Standartwerte sind Visible = False Aktiv = false Alpha = 0
nein leider nicht, immernoch sobald ich es zeichnen lasse alles schwarz, hab auch schon überlegt ob es vieleicht zu schnell geht weil ich hab ja immernoch gute 500fps aber selbst bei einem wert von 0.00000000001 ist es sofort schwarz
ja ich beginne in der gluPerspective und wechsle dann über glOrtho(0, MYOptionen.Aufloesung[1], MYOptionen.Aufloesung[2], 0, 4, 20); in den Ortho-modus danach wird gerendert, dazuwischen kommt dann der 3D teil deswegen wechsle ich obwohl es noch sinnlos klingt
und den alpha wert mal ausgeben lassen sagst du, hm ok ich wed mal sehen ob ich das hinbeomme sodass wir das auch verwenden können
€
ich hab ne möglichkeit gefunden, ich hab einfach ein memo erstellt wo ich in der renderprocedure immer den wert Alpha in eine neue zeile hab schreiben lassen und am ende des programms alles in einer datei speichern lassen so haben wir ziehmlich viel daten aber genau das was uns interessiert,
und wenn ich mir die datei ansehe sehe ich das der alphawert ordnungsgemäß ansteigt
aber mir ist auch aufgefallen das es völlig egal ist ob alpha 0 oder 1 ist, das quad wird trotzdem immer voll schwarz gerendert sobald ich visible auf true setzte
Registriert: Do Mär 05, 2009 20:17 Beiträge: 284 Wohnort: Kaiserslautern
musst du hier nicht auch den fall alpha = 1 und alpha = 0 behandeln?
sonst greifen doch die ifs in den fällen nicht, oder bin ich jetzt falsch?
Code:
procedure TFadeToBlack.Render; begin if Aktive then begin Visible := true; if Alpha < 1 then Alpha := Alpha + 0.001; end else begin if Alpha > 0 then Alpha := Alpha -0.001 else Visible := false; end;
wenns Unsinn ist bitte ignorieren
Edit.. nehmen wir an Alpha fängt bei 0 an, dann näherst du dich irgendwann der 1... wenns dann 1 ist trifft das erste if nimmer zu, geht also ins else und prüft obs größer 0 ist, größer 0 ist es ja also ziehst du 0,001 ab auf 0,999 im nächsten Durchgang bist du damit aber wieder kleiner 1 und erhöhst auf 1...
Meiner Meinung nach springt das nach dem ersten Hochlaufen auf 1 zwischen 0,999 und 1 hin und her. aber ich bin mir auch net sicher.
das stimmt nicht ganz, die überlegung is zwar korrewkt aber der else zweig stützt sich auf "if Aktive", der wert wird erst wieder gen null reduziert wenn Aktive = false
die bessere schreibweise sollte das klar machen
Code:
procedure TFadeToBlack.Render; begin if Aktive then begin Visible := true; if Alpha < 1 then Alpha := Alpha + 0.001; end else begin if Alpha > 0 then Alpha := Alpha -0.001 else Visible := false; end;
Also ich würde auch Ziz´s Vorschlag folgen. Habe selber erst vor kurzem den Fogging/ Darkness Effekt mit Hilfe des DGL Tutorials eingebaut und ich war überrascht wie einfach es ging.
Das Ganze lässt auch schöne Effekte zu. Wenn Du z.B. eine 3D Welt aus der 1. Person Perspektive hast, kannst Du die Dunkelheit "näher kommen lassen" (also den Effekt einer schwächer werdenden Lichtquelle erreichen).
Ich habe mal ein Screenshot als Beispiel angehängt.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
_________________ Wissen nennen wir jenen kleinen Teil der Unwissenheit, den wir geordnet und klassifiziert haben. (Ambrose Bierce)
Mitglieder in diesem Forum: 0 Mitglieder und 0 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.