Bin gerade beim Blending. Irgendwie funktioniert es nicht so ganz.
Er Zeigt immer nur das Quad mit der Textur Rock an.
Die gras vernachlässigt er. Wernn ich das Zero und One vertausche zeichnet er garnichts.
Beide Texturen Funktionieren auch. Hab sie mal nebeneinander gezeichnet ohne Blending.
was mich auch verwundert hat. Warum zeichnet er das erste Quad in den Vordergrund über das zweite, wenn ich kein blending an hab ?!
Code:
procedure TForm1.glDraw;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45.0, ClientWidth/ClientHeight{Verhältniss höhe zu Breite}, NearClipping{wie nah man sehen kann}, FarClipping{wie weit man sehen kann});
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(0,0,-5);
//Blending aktivieren, Hintergrund belassen zum Pfaden Alpha-Wert nehmen
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich denke mal dein Problem liegt in erster Linie an dem Tiefentest. Normalerweise steht der auf GL_LESS. Das bedeutet es werden nur Flächen gezeichnet die eine geringere Tiefe haben. In deinem Falle (Multipass Verfahren) werden 2 Flächen aber an exakt der selben Stelle gezeichnet. Damit wird immer nur das erste dargestellt, da der Tiefentest das zweite bereits vor dem Blenden hinaus wirft. Andern kannst du es wie folgt.
Code:
glDepthFunc(LEQUAL);
Folgendes nach dem Initialisieren teil OpenGL mit er soll alles nehmen was eine kleinere oder gleiche Tiefe hat. Somit würde dein 2tes Quad dein erstes überschreiben. Aber dafür gibts dann blending.
Beim Blenden ist allerdings auch ein Fehler enthalten. Das erste Quad musst du immer ohne Blending zeichnen. Das Zweite würde dann auf das Quad geblendet werden.
Code:
glBlendFunc(GL_ONE,GL_ZERO);
Bei folgendem Aufruf würde er alles nehmen was gezeichnet werden soll und würde es so direkt in den Framebuffer schreiben. Das würde einem Zeichnen ohne Blending entsprechen.
Code:
glBlendFunc(GL_ZERO,GL_ONE);
Bei würdest du ihm sagen er soll nichts von dem Nehmen was geeichnet werden soll und alles aus dem Framebuffer behalten. Das wäre so als würdest du nichts zeichnen.
Diese beiden Fälle machen eher weniger Sinn. Da sie entweder das eine oder das andere Benutzen. Zum einfachen Addieren (Adaptives Blending für Partikelfeuer etc.) kannst du GL_ONE und GL_ONE verwenden.
Im Normalfall wird mit einem Alphakanal (oder Alphawert mittels glColor) geblendet. Das sähe dann so aus.
Um das mal zu erklären. Von dem zu Zeichnenden würde er SRC_ALPHA benutzen. Also der Alphawert der Quelle (Alphakanal oder Alphawert von glColor). Und von dem Framebuffer würde er 1-den Alphakanal oder Alphawert benutzen. Soll bedeuten bei einem Alpha von 0.1 würde er den Farbwert mit 0.1 Multiplizieren und den Framebuffer imit 0.9 und beides Addieren und so in den Framebuffer packen.
Aber das ist auch alles in unserem Blendingtutorial beschrieben.
PS: Blending ist nicht unbedingt einfach zu verstehen. Ich selber habe auch ne Weile gebraucht bis ich es verstanden haben.
PPS: Ganz unten in dem Tutorial befindet sich auch ein Abschnitt über Multitexturing. Dabei werden mehrere Texturen auf ein Quad gezeichnet. Das ist immer schneller als mehrere Quads zeichnen zu müssen.
perfekt. so funktionierts. Kann jetzt entweder nur das gras zeigen oder beides Übereinander Legen.
aber wenn ich nur den steinigen hintergrund haben will zeichnet er mir schwarz.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also du solltest vor dem zeichnen ein mal die Farbe weiß mittels glColor setzten. Es kann nämlich sein, dass diese auf etwas amderes steht. Und da die Farbe deine Ausgabe maßgeblich beeinflusst solltest du es nicht dem Zufall überlassen.
Dann solltest du etwas anderes benutzen als GL_ZERO vs. GL_ONE. Diese Kombination aktiviert jeweils immer nur eines von beiden. Testweise wäre wohl GL_ONE und GL_ONE besser. So lange bist du beide Texturen siehst. Dann kannst du dir immer noch die richtige Func suchen.
Aktivieren solltest du Blending dann aber auch. Und nicht vergessen. Solltest du es nicht mehr benötigen, dann solltest du es wieder deaktivieren.
Das Zurücksetzen der Texturematrix kannst du im übrigen auch weglassen. Das musst du nur dann tun, wenn die sie überhaupt verändert hast.
Oder machen wir es mal ganz einfach. Ich denke das geht schneller. Ich würde es so machen.
Der Unterschied ist jetzt lediglich, dass ich das zweite Quad mit einem Alphawert von 0.5 (50%) und einer Blendfunc, die den Alphawert berücksichtigt, gezeichnet habe.
PS: Bitte benutz zum Code posten die Pascaltags. Danke.
OK. Soweit so gut.
Blending *g* .. ein heikles Thema ^^
Es funktioniert mal zumindest.
Blending kann man also als Bluebox benutzen ?!
für ein Fenster ?!
und für Übergänge von Bodentexturen z.b. ?
Aber was ist der Alpha wert ?! . Was macht er ? vielleicht versteh ich dann die zusammengänge mit den ganzen Funktionen
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also BlueBox nein. Dabei wird ein bestimmter Farbwert ersetzt. Das ist beim Blening nicht so.
Was macht das Blending. Du hast einen Framebuffer in dem befindet sich zum Beispiel dein erstes Quad. Wenn du jetzt ein anderes Quad zeichnen würdest würde alles was im Framebuffer enthalten ist überschrieben werden. Mit dem Blending kannst du aber sagen was er damit anstellen soll. Also wie soll er das eine Pixel was gerade gezeichnet wird mit dem aus dem Framebuffer verrechnen. Und genau das kannst du mit dem Blending bestimmen. In dem kannst du zum beispiel mit GL_ONE sagen nimm es komplett. Und mit GL_ZERO sagst du eben. Nimm nichts.
Wichtig dabei ist aber, dass es immer nur das benutzen kann was sich gerade im Framebuffer befindet. Wenn du hinterer noch etwas hinter das Quad zeichnen würdest würde es nicht berücksichtigt werden.
Der Alphakanal dient dazu um eine Transparenz anzugeben. Bei Texturen kann man so einzelne Pixel/Bereiche Transparent machen und andere nicht. Oder eben mit glColor auch ganze Flächen.
Ich kann dich aber nur noch eindringlichst auf das Blending Tutorial verweisen. Da sind sehr viele Sachen sehr ausführlich beschrieben. Link war weiter oben.
Mitglieder in diesem Forum: 0 Mitglieder und 6 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.