Registriert: Mo Jun 12, 2006 14:47 Beiträge: 75
Programmiersprache: Object FPC
Hallo alle Mit einand.
Ich progge mittlerweile auch schon den ein oder andere Tag mit OpenGL und habe Letzten Wochen schon fast meinen Rechner aus dem Fenster geworfen vor Verzweiflung.
Ich wollte mittels AlphaBlending ein Bild Maskieren und dieses dann Rendern
Machen kann weis ich. Ich wollte es aber Absichtlich nicht so machen.
Selbst mein Prof an der Uni sagte mir nun das der Obige Code Korreckt sei. Aber es ging einfach nicht.
Also habe ich heute in meiner Verzweiflung ein Programm geschrieben das sämtliche Daten der Grake ausliest. Und dieses Tool ( was ich bald auch auf meine HP (Link) stellen werde , falls jemand neugierig ist und diese Infos auch haben will ) hat es mir dann gezeigt.
DGLOpenGL schafft es einfach nicht einen Alpha Buffer zu Allokieren.
Sieht man sich den Source an merkt man auch schnell warum. Ich habe mir mal Erlaubt das Ganze um zu schreiben und Poste hier meine neue CreateRenderingContext die ich nutze.
Bitte Passt das Ganze an, oder sagt mir wie man es in eurem Sinne Korreckt macht. Tatsache ist aber das mit dieser Änderung mein Oben geposteter Source wunderbar funktioniert !!
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Grundsätzlich eine gute Idee so wie ich das sehe, allerdings würde ich statt einfach ColorBits zu übergeben einen neuen Parameter hinzufügen um auch das auschalten des Alpha-Buffers zu erlauben.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hab es mal hierhin verschoben.
Also etwas an der Schnittstelle ändern werde ich nicht. Es wäre natürlich das Sinnvollste und Beste. Nur um das klar zu stellen. Aber bei einem Header der recht weit verbreitet ist darf man nicht einfach etwas ändern was zu inkompatibilitäten führt. Deswegen muss die Schnittstelle zu mindest so bleiben wie sie ist.
Von Hause aus aber immer einen Alphakanal zu erstellen halte ich für wenig sinnvoll, da er auch bei 16 bzw 24 Bit versuchen würde einen anzulegen. Und man das wie Horazont schon sagte eben auch nicht unterbinden könnte. Bzw kann man sich auch nicht drauf verlassen, dass man unbedingt auch einen bekommt. Da hat der Treiber das letzte Wort. Meine ATI zum Beispiel erstellt bei 32 Bit automatisch einen Alphakanal. Und bei 16 Bit Farbtiefe (wenn ich Alpha auf 8 Bit setze) wird noch zusätzlich ein 8 Bit Alphakanal erstellt. Habe es gerade ausprobiert.
Diese Methode im Header hat auch nicht den Anspruch perfekt zu sein. Sie soll lediglich einen leichten Einstieg ermöglichen. Und das Auslesen des Framebuffer kann mitunter auch recht langsam werden. Da gab es auch schon schon mal ein Thema zu wo die Geschwindigkeit dadurch wirklich langsam wurde.
Da ich aber nicht nur Kontra bin hier mein Vorschlag. Man könnte es so erweitern, dass die derzeitige Funktion auf die Erweiterte zurückgreift. Aber viel wichtiger wäre mir, dass man es in einem Jahr nicht schon wieder verändern müsste. Es sollte natürlich auch nicht komplizierter werden als der Weg über die GDI. Die im übbrigen ja auch nicht wirklich komplex ist. Also man ist ja nicht unbedingt gezwungen den Header zu benutzen. Das aber nur mal so in den Raum geworfen.
Mit anderen Worten. Mich würden dazu auch andere (und/oder ergänzende) Meinungen interessieren. Ich möchte da nur nichts übers Knie brechen oder etwas implementieren was über den Funktionsumfang des Headers hinaus geht.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7804 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Überschreib doch einfach die Funktion. Delphi unterstützt doch Funktionen mit gleichem Namen aber unterschiedlichen Parametern. Behalte die Funktion wie sie ist, und biete eine alternative mit an, der man übergibt wie gross der Alphabuffer sein soll.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Mo Jun 12, 2006 14:47 Beiträge: 75
Programmiersprache: Object FPC
oh man warum sind wir da nicht gleich drauf gekommen.
Flash hat vollkommen Recht. Durch ein Überladen wäre das Prob optimal gelöst.
Und was die Erweiterungen angeht ist's doch auch klar.
man schaut sich
Code:
tagPIXELFORMATDESCRIPTOR =packedrecord
nSize:Word;
nVersion:Word;
dwFlags:DWORD;
iPixelType:Byte;
cColorBits:Byte;
cRedBits:Byte;
cRedShift:Byte;
cGreenBits:Byte;
cGreenShift:Byte;
cBlueBits:Byte;
cBlueShift:Byte;
cAlphaBits:Byte;
cAlphaShift:Byte;
cAccumBits:Byte;
cAccumRedBits:Byte;
cAccumGreenBits:Byte;
cAccumBlueBits:Byte;
cAccumAlphaBits:Byte;
cDepthBits:Byte;
cStencilBits:Byte;
cAuxBuffers:Byte;
iLayerType:Byte;
bReserved:Byte;
dwLayerMask:DWORD;
dwVisibleMask:DWORD;
dwDamageMask:DWORD;
end;
an und schaut einfach mal welche dieser Werte Zusätzlich noch von Interesse sein könnten. Diese nimmt man dann in die Parameterliste der neuen CreateRenderingContext auf.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Flash so weit so klar. In meinem Post habe ich das ja auch schon angedeutet "Man könnte es so erweitern, dass die derzeitige Funktion auf die Erweiterte zurückgreift.".
Wie man das dann löst hängt davon ab was für Forderungen insgesammt aufkommen. Aber das ist nun wirklich kein Problem. Mir geht es vielmehr darum, dass man sich mal gedanken macht was man wirklich braucht. Und dann nicht einfach nur die Methode erweitern sondern so gestalten, dass man evtl auch die ein oder andere altlast loswird.
Als Beispiel. Bei der aktuellen Methode wird noch ein AuxBuffers und ein Layer übergeben. Layer sind zwar vorgesehen aber bei welcher Grafikkarte werden die denn tatsächlich unterstützt? Doch eher nur bei den richtig teuren. Und ob man die dann überhaupt braucht steht noch ganz woanders geschrieben. Oder wie schaut das mit Multisampling aus?
In diese Richtung möchte ich das Ganze gerne lenken. Denn das was ich dann implementiere werde sollte schon gut überlegt sein. Also es sollte all das bieten was man haben will und es sollte keine Methode mit 20 Parametern werden. Dann kann man das schon fast selber programmieren.
PS: Entschuldigt, dass ich es nicht einfach so umsetze sondern es komplizierter mache. Haltet meine harte Haltung aber bitte nicht für Kontra. Ich möchte nur vermeiden, dass man etwas zu früh verabschiedet was man eigentlich hätte besser machen können.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Also mir kommt das hier sehr spanisch vor. Ich hab ja schon auf nem dutzend verschiedener Grakas OGL gemacht (NVidia, Kyro, Matrox, ATI, etc.) und nie ein solches Problem gehabt, genausowenig einer meiner User (und Napalm Bomber 3D hat z.B. >100.000 Downloads).
Ausserdem steht sogar im MSDN dass zuerst ein Pixelformat gesucht wird dass dem iPixelType entspricht. Wenn man da also PFD_TYPE_RGBA angibt sucht die Funktion zuerst ein Format mit RGBA-Kanälen. Und sollte er kein solches finden, dann erst sucht er ein Format dass zu den via c*Bits angegebenen Attributen passt.
Wenn es hier also ein Problem gibt, dann liegt es wohl eher auf Seiten des Treibers als auf Seiten des Headers. Du nutzt nicht zufällig irgend einen geleakten Beta-Treiber?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Es ist auch nicht die welt, sich mal schnell die Funktion für den privaten Gebrauch zu erweitern, falls man mehr braucht, als implementiert ist. Ich habe mir "damals" auch eine Funktion geschrieben, die kurz ein Dummy-Form erstellt wo es einen RC created um die Multisampling-Fähigkeit zu prüfen. Das war wirklich nicht das Problem. Seit dem ich SDL nutze ist mir das relativ egal, von daher werde ich mich bei der letzendlichen Entscheidung, die Funktion zu ändern bedeckt halten, aber eine überladene Methode wäre vielleicht sinnvoll.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mo Jun 12, 2006 14:47 Beiträge: 75
Programmiersprache: Object FPC
@Lossy eX
Keine Sorge ich halte es nicht Für Kontra, im Gegenteil. Ich finde es gut das du dir Wirklich gedanken um der Ganzen Dinge machst und nicht einfach schnell und unüberlegt nachbesserst damit halt Ruhe ist.
und J aich habe 32 bit Farbiefe. Ich nutze hier eine Gforce 8800 gts Ich denke doch das die mit den Aktuellen OpenGL Sachen klar kommen sollte.
@ Sasche
ich nutze die Treiber Ver : 6.14.10.9792 mir sagt das nix aber vielleicht dir.
@Lord Horazont
Versteh mich net Falsch. Ich habe für meine Privaten Zwecke die Unit auch umgeschrieben. Nur mus man immer an die jenigen denken die sich mit der ganzen Zhematik nicht auskennen und diese sind Froh wenn sie sehen das es da einen Alphakanal gibt.
Ich hab auch fast ne Woche gebraucht bis ich es gefunden hab.
Mitglieder in diesem Forum: 0 Mitglieder und 15 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.