die teile, die durchsichtig sein sollten sind aber nicht durchsichtig... ClearColor hab ich auch auf (0,0,0,0). ich find einfach kein Fehler. Blickt da jmd durch?
Du benutzt ja kein FBO sondern kopierst aus dem regulären Framebuffer. Daher musst du deinen Framebuffer so erstellen das er auch Alpha kann. Die bessere Alternative ist natürlich ein FBO zu benutzen.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
hab grad versuch alles auf FBO umzubauen. Ich hab jetzt beides Laufen und kann mit ner Boolean Variable umschalten. Aber es macht nich das was es machen soll. Es soll so aussehen wie auf dem Bild, das geht aber nur mit der Textur (siehtman ja is net durchsichtig). Mit dem FBO kommt immer nur 1 Ring -.-
€: Textut hab ich aber auch shcon auf AlphKanal abgeändert:
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
habs jetzt mit glBitmap gemacht. Aber das GrabScreen dauert sehr lang...Ich hab zwar jetzt gewünschten Effekt, es wär mir aber trotzdem lieb wenn ich das FBO noch zum laufen bekomm...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Nichts gegen meine Unit. Allerdings ist die Funktion GrabScreen auch wirklich nur dazu da um ein ScreenShot zu erstellen. Entsprechend darf sie auch total langsam sein. Und für deinen Fall ist sie alles Andere als zu empfehlen.
Sonst kann ich Coolcat nur zustimmen. Zeig uns mal deinen FBO Code. Also die Erstellung des FBOs und das Zeichnen in das FBOs. Du musst beim Befüllen deines FBOs darauf achten, dass du dessen bisherigen Inhalt nicht löscht sondern in das Resultat mit einbeziehst. Ansonsten kann es natürlich passieren, dass du ständig nur mit einem Ring da stehst.
Kleine Anmerkung zu deinem Code von oben. - Beim Erstellen einer leeren Textur musst nicht immer einen Buffer angeben. Wenn du den Inhalt sowieso überschreiben willst genügt ein NIL als Buffer. Die Textur wird trotzdem normal erstellt. Größe und Format sind bekannt. Und das ist das Wichtigste. Das Erstellen und Übertragen eines ungenutzen Buffers ist nur schwer zu handhaben und kostet nur Leistung. Was es aber nicht müsste. - Du hattest ja von 3 auf 4 umgestellt. Deine Textur war vorher schon RGBA. Nur die übergebenen Daten haben sich geändert. Coolcat meinste da aber was anderes. Und zwar dein FrameBuffer/RenderKontex. Der muss auch über einen Alphakanal verfügen. Das muss beim Erstellen des RenderKontexes berücksichtigt werden. Und nach dem Erstellen muss das auch überprüft werden. Da der Treiber immer noch das letzte Wort dabei haben kann. Bei FBOs ist das anders. Entsprechend sollten FBOs auch immer vorgezogen werden. Unter anderem sind FBOs auch um ein vielfaches besser auf moderen Hardware zugeschnitten.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Trotz den berechtigten Hinweisen auf FBO will ich noch kurz anmerken, dass du glCopyTexSubImage2D nehmen solltest, statt glCopyTexImage2D. Letzteres erstellt die Textur nämlich komplett neu (deshalb musst du auch das Format noch mal neu angeben), was die Leistung ebenfalls extrem drückt. Die andere Funktion belässt das Format der Textur wie es ist (und erlaubt auch keine Größenänderung) und überschreibt wirklich einfach nur den Inhalt, also das, was du willst.
Ansonsten, nochmal der Hinweis, du führst nicht zufällig glClear mit den GL_CLEAR_COLOR_BITS auf deinen Hauptpuffer aus, womit du den vorherigen Inhalt natürlich killst?
greetings
_________________ 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
Wenn du das FBO in einer Schleife benutzt, musst du außerdem beachten, dass du nicht gleichzeitig in die Textur rendern und sie auf eine Fläche auftragen kannst.
ColorBits sind auf 32 also is Alpha vorhanden, oder? ich denke es liegt an dem was Schläfer gesagt hat, deshlab machichmir jetzt m,al nich die mühe un stückel den FBO Code hier rein, ich versuch das Problem erstma so zu lösen un dann guckmer weiter...
@LordHorazont: so ruf ich meni glClear auf:
Code:
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
aber danch zeichne ich das neu, was in die Textur soll... ich probier das jetzt aber nochma mit glCopyTexSubImage2D...
@Schläfer: stimmt das wusst ich nich, aber erscheint logisch ^^ also muss ich die Textur vom FBO erst in ne andere Textur kopieren, wie mich ich das? Und ist das von der Rechenzeit kleiner als das GrabScreen der glBitmap? sonst lohnt sich der Aufwand ja nich...
Ob man das Bild aus einem FBO kopieren kann (ohne das der Alphakanal verschwindet) weiß ich nicht, kann aber gut möglich sein. Es gibt aber noch eine andere Möglichkeit mit 2 FBOs:
Man bindet immer die Textur des jeweils anderen und wechselt bei jedem Durchlauf das FBO in das man zeichnet hin und her. Das verbraucht natürlich mehr Speicher, aber normalerweise soll in ein FBO rendern, schneller sein als das Bild nachträglich in eine Textur zu kopieren.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
gut dann mach ich das ma so... ich glaub aber das wird jetzt nix mehr muss erstma los. entweder ich mach das heut nacht noch oder morgen. ich meld mich...
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
ich habs jetzt mit 2 FBOs hin bekommen. Aber im Vergleich zu der Lösung mit der Textur sieht es nicht so schön aus (siehe Bild). Die Stellen die es sanft ausblenden sollte (AlphaBlending mit Alpha 1-0) werden jetzt nach einigen Durchläufen komplett schwarz. Ich glaub das liegt irgendwie daran, wie ich die Textur des FBOs erstell, bzw wie ich das zeichne, denn ich muss jetzt mit den Alpha-Werten auch ganz vorsichtig umgehen.
FBO Code:
Code:
type
FrameBufferException =class(Exception);
TFrameBufferObject =class(TObject)
private
//das eigentliche FrameBufferObject (Index von OpenGL)
//[...] weiter untern wird das FBO wieder entbunden
Das FBO einfach nicht zu leeren, um den Inhalt vom letzten Renderdurchgang zu behalten, hab ich auch probiert, aber da kann ich das alte Bild nicht verzerren, wie man das auf dem Bild sieht. Oder gibts da doch ne Möglichkeit? Weil beim Nicht-Löschen hatte ich auch nich das Problem mit den schwarzen Stellen...
MfG Bergmann
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Ich versteh' immernoch nicht wie du das eigentlich zeichnest. Für mich sieht das (zumindest das erste Bild) so aus als ob mehrere male eine Textur übereinander geblendet wurde. Zuerst die Breiten und dann die Runderen drüber. Aber dazu brauch' man kein FBO. Außer die Textur ist aus einem FBO, dann bräuchte man aber nur eins. Vielleicht kannst du dazu noch was schreiben, ansonsten ist das Ergebnis für mich genauso rätselhaft.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Mich würde interessieren, wie du fFadeOffColor berechnest. Ich habe die Vermutung, dass du das zum ende hin schwarz werden lässt, was die Farbe erklärt, aber noch nicht den Effekt. Wegen dem Effekt scheint es mir so, als ob du die Textur, die das komplette Bild enthält, mit Alpha-Blending darauf zeichnest, immer und immer wieder. Das könnte zumindest eine Erklärung sein, sicher bin ich mir da auch nicht. Denn so wie du das machst, braucht die Textur eigentlich gar keinen Alphakanal... Wenn ich mich jetzt nicht gewaltig irre zumindest.
greetings
_________________ 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
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.