Registriert: Mo Jun 12, 2006 14:47 Beiträge: 75
Programmiersprache: Object FPC
Hallo Alle Mit einand.
Ich versuche gerade mir ein Sample zu Baun das so die Grundlagen von Blending Zeigt. Dazu habe ich mit verschiedenen Headern ( unter anderem SDL, DGLOPENGL, GL und OpenGL32.dll ) ein Fenster erstellt.
und dann folgendes in meine Render Function Eingetragen.
Code:
glenable(GL_BLEND);
glBlendFunc(gl_ONE, GL_ZERO);
glcolor3f(1,0,0);
glbegin(GL_TRIANGLES);
glvertex3f(0,0,0);
glvertex3f(1,1,0);
glvertex3f(0,1,0);
glend;
glBlendFunc(gl_ONE_MINUS_DST_ALPHA, GL_ONE);
glcolor3f(0,1,0);
glbegin(GL_TRIANGLES);
glvertex3f(1,0,0);
glvertex3f(1,1,0);
glvertex3f(0,1,0);
glend;
Zu Sehen ist dann immer das Rote Dreieck, aber nie das Grüne. Eigentlich sollte aber das Grüne auch zu sehen sein. Zumindest der Teil der nicht unter dem Roten ist.
Alle Erstellten Samples laufen weder auf meinem Rechner, noch auf meinem Laptop.
Habe das ganze dann verschickt an jemand anders bei dem Liefs angeblich, aber gesehn hab ichs net.
Mein Rechner hat ne Gforce4 ti 4600. Die müste ja eigentlich schon OpenGL fähig sein, oder ?
Gibts da noch irgend einen trick ?
bzw mag mir das jemand in eine Exe Kompilieren und mir diese Schicken , so das ich Testen kann obs dann tut.
Ach bevor ich es Vergesse :
Wenn ich das ganze unter C++ Compiliere und dann auf meinem Rechner ausführe klappt es wunderbar.
Registriert: So Sep 26, 2004 05:57 Beiträge: 190 Wohnort: Linz
Wenn du in der Blend-Funktion DST_ALPHA verwendest, so musst du auch sicherstellen das dein Framebuffer Alphawerte enthält. Dies gibst du im Pixelformat bekannt, also beispielsweise in Windows mit der Funktion ChoosePixelFormat. Wird aber vor allem auf älteren Karten wohl eher nicht in Hardware unterstützt, also wenn es sich vermeiden lässt würde ich das anders machen. Bei welchen Grafikkarten genau das funktioniert weiß ich nicht, aber wenn du es im Pixelformat angibst solltest du zumindest entsprechende Fehlermeldungen von den jeweiligen Funktionen erhalten.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich würde mich nicht darauf verlassen, dass du dann immer einen Alphakanal im Framebuffer bekommst. Sobald du zum Beispiel im Windows auf 24 Bit Farbtiefe stellst könnte er auf einigen Systemen weg sein. Bzw ist das Pixelformat nur ein Vorschlag. Was die OpenGL/Windows dann anbietet bleibt denen überlassen. Also typisch bei 24 Bit Farbtiefe dann.
Evtl solltest du für später auch überlegen wie du das Realisieren könntest ohne einen Alphakanl im Framebuffer zu benötigen bzw ohne aus dem Framebuffer zu lesen. Das ist nämlich mitunter auch nicht das Schnellste.
Registriert: So Sep 26, 2004 05:57 Beiträge: 190 Wohnort: Linz
Es ist nicht so sehr das Problem dass ChoosePixelFormat nur einen Vorschlag macht:
Zitat:
If the function succeeds, the return value is a pixel format index (one-based) that is the closest match to the given pixel format descriptor.
Da kannst du dann mit DescribePixelFormat abfragen ob da eh wirklich ein Alphawert im Framebuffer drinnen ist. Das größere Problem ist, dass es nicht mehr ganz so leicht ist zu überprüfen ob das dann auch in Hardware-Modus läuft oder von Software emuliert wird.
Im Zweifelsfalls kannst du mit der Extension WGL ARB pixel format auch die HW-Unterstützung sicherstellen.
Mir würde spontan zu
glBlendFunc(gl_ONE_MINUS_DST_ALPHA, GL_ONE);
noch etwas anderes einfallen. Du rechnest ja im Prinzip (1-dst_alpha)*src_color + 1*dst_color.
Erstens ergibt dies gegebenenfalls einen Wert GRÖßER als 1, was unterschiedliche Ergebnisse bei unterschiedlichen Grafikkarten bringen könnte (interne Rechengenauigkeit).
Zweitens gibst du keinen Alpha Wert explizit an, also ist sowohl beim ersten Dreieck als auch beim zweiten der Alphawert 1:
(1-1)*src_color + 1*dst_color = dst_color
Damit dürfte NUR das Dreieck in der zuletzt angeführten Farbe angezeigt werden.
Wenn du additives Blending probieren willst, so muss du glBlendFunc(GL_ONE, GL_ONE) angeben, bei gewichtetem Blending
glBlendFunc(gl_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA)
Einfach mal rumprobieren, Blending geht eigentlich immer, auch ohne Alpha bits anzugeben (also Alpha bits = 0, selbst in reiner Software Emulation).
_________________ "Wer nicht arbeitet, kann auch nichts falsch machen"
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Lyr: Nicht ganz. Du kannst abfragen ob das ganze in Software läuft wenn nach einem DescribePixelFormat in dem Feld dwFlags das Flag PFD_GENERIC_FORMAT gesetzt ist.
Corpsman: Aber mal ne ganz andere Frage. Was genau hast du damit vor? Evtl ist es ja so, dass du das Problem viel zu kompliziert siehst und es noch so 1-2 andere bessere Möglichkeiten gibt. So richtig habe ich nicht verstanden was du damit bezwecken möchtest.
PS: Die Blendfunc glBlendFunc(GL_ONE, GL_ZERO); ist genau das Gleiche wie ein deaktiviertes Blending.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Na ja. Okay. So etwas ähnliches habe ich mir schon gedacht. Da ist es dann recht egal. Nur bei Anwendungen die auf so vielen Systemen wie möglich funktionieren sollen kann man nur vom Gebrauch des Framebufferalphakanals abraten. Da dieser nicht immer zwingend gegeben sein muss.
PS: Wo dieser aber vorhanden sein muss sind zum Beispiel PixelBuffer oder Framebuffer Objects. Diese kann man dann wiederrum als Textur verwenden. Das aber nur mal am Rande.
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.