Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 19, 2025 21:41

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
BeitragVerfasst: Fr Nov 06, 2009 10:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bergmann89 hat geschrieben:
@LossyEx:
Code:
  1. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
ColorBits sind auf 32 also is Alpha vorhanden, oder?

Jain. Mal ja mal nein. Kann auch passieren, dass du 32 Bit Farbtiefen bekommst und die 8 Bits für Alpha ungenutzt bleiben. Oder wenn im Windows 24 Bit eingestellt ist bekommst du auch nur 24 Bit obwohl du 32 übergeben hast. In CreateRenderingContext wird ein PixelFormatDescription benutzt. Und das Ding hat ein Feld für Alpha. Das muss man setzen und an ChoosePixelFormat übergeben. Wenn man anschließend das PixelFormat wieder erfragt und dann das Feld immer noch gesetzt ist NUR DANN hat man einen Alphakanal im Framebuffer. Nur für den Fall, dass du ein Fallback einbauen willst.

FBO: Ob das resultierende Bild einen Alphakanal benötigt hängt davon ab was du machen willst. Da müsstest du uns eventuell auch sagen was du damit überhaupt vor hast. Anhand von dem Bild würde ich aber sagen, dass es dir da irgendwo den Alphakanal zerschießt. Ich kann allerdings nicht genau sagen wo. Ich bin mir auch gerade nicht sicher was passiert, wenn du dein Kreis zeichnest. Also welcher Alphawert letzten Endes in das FBO geschrieben wird. Speziell meine ich die Mitte deines Kreises. Dort befinden sich Alphawerte von 0. Wenn die Werte direkt ins FBO geschrieben werden hast du an der Stelle einen Alpha von 0. Wenn die miteinander Multipliziert werden, dann ist irgendwas*0 trotzdem 0. Entsprechend wäre diese Stelle beim nächsten Durchgang weg, da du die Alphawerte zur Berechnung des nächsten Durchganges benutzt. Auf deinem Bild ist dort ja auch gähnende Leere. Ich wüsste so Spontan auch nicht was OpenGL dort anders machen sollte also die beiden genannten Möglichkeiten.

Wenn du keinen resultierenden Alpha benötigt, dann sollte es vollkommen ausreicht, wenn du die Textur des anderen FBOs ohne Blending in das aktuelle FBO zeichnest. Dabei dann auch verformen etc. Ausblenden würde ich dann eventuell über die Farbe machen. Sonst hättest du wieder das Problem mit dem Alpha aus dem FBO. Anschließend dann die Kreistextur in das FBO blenden. Den Alphakanal dürftest du dann beim Zeichnen in deiner Szene auch außen vor lassen. Da sonst wieder komische Dinge entstehen.

Wenn du einen resultierenden Alphakanal benötigst würde ich fast behaupten wäre das ein klarer Fall für Shader ist. Also via Multitexturing die beiden Texturen gleichzeitig an einen Shader übergeben und dann im Shader die beiden Texturen verrechnen. Das Ergebniss würde ungeblendet in das FBOs geschrieben werden. Dann kannst du auch sehr genau bestimmen was als Alphawert in der Textur landet etc. Damit würdest du dann durchgängig die Kontrolle über deinen Alphakanal besitzen. Und du könntest die Textur aus deinem FBO via Blending in deiner Szene benutzen. Natürlich nur, wenn ich mich da gerade nicht vollkommen vertue. Allerdings musste ich in meiner TextSuite eine spezielle Methode zum Blenden von 2 transparenten Ebenen einbauen. In so einem Fall ist das was auch von OpenGL zum Blenden verwendet wird nicht zu gebrauchen.


Mir sind aber in dem Code noch ein paar Sachen aufgefallen die ich bisher anders gemacht habe. Von daher bin ich mir nicht ob das wie ich das bisher immer gemacht habe so optimal ist oder Konfliktpotential bietet. Vielleicht kann das ja einer von den Cracks noch mal bestätigen oder korrigieren.
- Wenn ich überwiegend 2D zeichne und die Zeichenreihenfolg für das Ergebniss ausreicht, dann kann man doch den Tiefenbuffer weglassen bzw er wäre dann unnötig?
- Beim Zeichnen in ein FBOs hatte ich bisher immer mit glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT) ausgefählt in welches Ziel ich zeichnen wollte. Bzw anschließend mit glDrawBuffer(GL_BACK) wieder festgelegt, dass ich in den Backbuffer zeichnen wollte. Muss man das machen oder ist das nur zum Rendern in mehrere Targets wichtig?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Nov 06, 2009 15:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

erstmal zu Erklärung was ich genau mach: Ich hab 2 Renderdurchgänge, einen der die FBOs neu füllt und einen der alles auf dem Screen ausgibt. Ich zeichne erst die Textur (verzerrt), dann zeichne ich normal einen Ring drüber und pack das ganze in die Textur. Dann sind in der Textur 2 Ringe. Beim nächsten Durchlauf werden's 3 usw. Also brauch ich die Textur beim rendern ins FBO, deshalb 2.
Das fFadeOffColor wird vom User festgelegt und steht beim Bild oben (mit Textur) auf [1,1,1,0.9] und beim Bild unten (mit FBO) auf [1,1,1,0.99]. Ich weis nicht, warum das FBO so empfindlich auf den Alpha-Wert reagiert.
Ich hab das ganze am Anfang auch komplett ohne Alpha-Werte gehabt, da der Kreis aber ein eigenes Objekt ist un ich den später in nem andern Projekt benutzen möchte hab ich den AlphaWert eingebaut, das ich dann normales Alpha-Blending nutzen kann. So kann ich dann auch hinter den Kreis objekte zeichnen die dann vom Kreis sanft überdeckt werden.
Ich hab auch mal zum Test das FBO nicht geleert, da hab ich das Problem mit den schwarzen Stellen nicht...

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Nov 06, 2009 16:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wie du vor gehst wissen wir. Das wurde hier ja so auch vorgeschlagen. ;) Was ich eigentlich meinte ist was du überhaupt insgesammt damit vor hast? Vielleicht so was wie das da? So was zu wissen ist nicht ganz unwichtig. Das grenzt für uns die möglichen Anwendungsfälle gehörig ein. Und das ersparrt eventuelle Diskussionen in eine Richtung die letzten Endes dann doch nicht funktionieren, weil das dann noch irgendwas ganz spezielles machen soll.

Das du einen Alphakanal brauchst ist aber schon mal eine Aussage. Damit kann man alle Lösungen weglassen die einen fehlerhaften Alphakanal erzeugen.

Warum der Alphakanal deiner Texturmethode funktioniert liegt vermutlich daran, dass die Texturmethode gar keinen echten Alphakanal benutzt hat. Und damit wurde der Hintergrund gezeichnet und der neue Kreis darüber geblendet. Und warum das beim FBO nicht funktioniert habe ich versucht oben zu erklären. Ich vermute sehr stark, dass beim Zeichnen einer Textur in das FBO der Alphakanal im FBO einfach überschrieben oder moduliert wird. Und das ist falsch. Lösung = Shader.

Zum Testen wie deine erzeugte Textur (mit Alphakanal) aussieht kannst du entweder einen Shader bauen der das Ergebniss auf dem Bildschirm darstellt. Oder für Debugzwecke lädst du dir die Texturdaten von der Grafikkarte. Das geht auch mit der glBitmap. 2D Instanz erstellen. Textur ID zuweisen, GetDataFromTextur aufrufen und als Datei (TGA) speichern. Wichtig beim Freigeben der Instanz vorher das Flag DeleteTextureOnFree auf false setzen, da sonst die Textur auf der Grafikkarte gelöscht wird. Das gespeicherte Bild kannst du dir dann in GIMP anschauen und überprüfen wie sich der Alphakanal verhält. Ich denke der dürfte murks sein. Bzw dem entsprechend was du so auch als Textur hättest.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Nov 06, 2009 18:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

ja genau das hab ich vor, is ja auch von mir^^ Also ne Visualisierung der Musik. Der Ring funzt ja aber ich würd halt gern noch den Effekt haben wie er im Bild 1 is (evtl kenn noch jmd die Feuerwalze-Vis. vom WMP). Und das möglichst schnell, weil 100% CPU last für ne kleine Visualisierung is zu viel^^
Das mit der Textur speichern mach ich ma noch. geht aber grad net, weil ich ne ältere Version benutz, weil jetzt komischer Weise das OpenGL die Bass.dll ausbremst. Mit ner Datei gehts, wenn ich mir den Sound von Windows hole is es nich mehr syncron mit der Visualisierung...

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Nov 07, 2009 14:14 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ich hab' mal schnell die Variante mit den zwei FBOs nachprogrammiert und konnte den Fehler reproduzieren (siehe erstes Bild).
Durch rumprobieren hab' ich jetzt ein paar Lösungen:

-keinen Alphakanal für die Texturen der FBOs verwenden: erzeugt zwar das bild das du willst, hat aber offensichtlich keinen Alphakanal, also kann man nichts dahinter zeichnen :roll:

-glBlendFuncSeparate verwenden: beim zweiten Bild hab ich da als Parameter (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,GL_ONE,GL_ONE) und als Farbe auch (1,1,1,0.99) verwendet. Da sind dann diese unschönen schwarzen Streifen weg, die wahrscheinlich dadurch entstehen das die Basistextur am Rand von den farbigen Linien einen niedrigen Alphawert hat (ist ja klar), dieser aber auch mit dem Alphawert aus dem Bild auf das gezeichnet wird, verrechnet wird und deshalb den resultierenden Alphawert niedriger statt höher werden lässt.
Mit den Parametern hat man dann quasi additives Blending für den Alphawert. Vielleicht gibt es auch noch bessere Kombinationen, musst du mal probieren.
Einen kleinen Nachteil hat das ganze aber auch noch: Am äußeren Rand dieses gelben Linienzeugs ist der Alphawert viel höher als die Farbe dazu (sieht man auch im Bild mit den blauen Linien). Außerdem sollte die Hintergrundfarbe beim Zeichnen im FBO und beim fertigen Bild möglichst gleich sein, sonst hat man noch den typischen Fehler aus Bild 3.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Nov 08, 2009 20:22 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

sieht gut aus... also sind wir denk ich auf dem richtigen weg. ich probier ma noch n bisl mit den werten rum, um diesen hässlichen grauschleier weg zu bekommen (siehe bild)

MfG Bergmann


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Nov 08, 2009 20:58 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Der Grauschleier wird durch den Alphawert kommen. Jeder Wert <1 wird über kurz oder lang (bei mehrfachen blenden) schwarz werden. Wenn du also deine Röhre normal mit dem Hintergrund zusammenblendest, wird das Ergebnis eher dunkler werden.

Schau doch mal nach Blendfunktionen die eher additiv wirken. In Fotoshop gibts noch diverse andere Blendverfahren z.B. "Lighten". Wenn du rausfindest, welche Blendfunktion die nehmen, kannst du das nachbauen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Nov 08, 2009 21:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Du könntest es additiv versuchen, das wird aber definitiv zu viel sein, denke ich. Hier dennoch die Blendfunktionen dafür:
Code:
  1. glBlendFunc(GL_SRC_ALPHA, GL_ONE);

Da dann eventuell mit einem Alpha unter 0.1 spielen, damit es nicht zu stark aufhellt. Was auch gerne gemacht wird, einen Anteil per obiger Funktion und einen mit der normalen
Code:
  1. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
rendern. Also wenn du ein gesamt Alpha von 0.5 hast, würdest du z.B. 0.2 additiv und 0.3 normal blenden. Das kann auch einen interessanten Effekt haben. Spiel damit mal rum. Das Blenden mit unterschiedlichen Funktionen erfordert natürlich auch, es mehrfach zu zeichnen. Aber da das ja aus der Textur kommt und so nur ein Quad braucht, kostet das ja "nix".

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Nov 09, 2009 09:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
100% Last: Nur mal so ne blöde Frage. Du zeichnest nicht rein zufällig mit Application.OnIdle oder so? Wie auch immer. Du solltest natürlich nur dann zeichnen, wenn du neue Visualisierungsdaten hast bzw wenn es der Effekt verlangt. Aber auf keinen Fall in einer Schleife die auf maximale FPS ausgelegt ist. Außerdem solltest du mal überprüfen woher die Textur kommt und ob es da zu Engpässen kommen kann. Denn die Textur muss ja auch irgendwo erstellt und nach opengl geladen werden. Die entsteht ja nicht einfach aus dem nichts. Vielleicht wäre es da auch eine alternative eben keine Textur zu benutzen sondern vertexdaten zu übertragen und selber den Ring zu zeichnen etc.

Grauschleier: Ich könnte mir gut vorstellen, dass der Grauschleier eine Kombination aus ungünstiger Ausgangstextur und interpolation + blending ist. Nehmen wir mal an in der Ausgangstextur befindet sich ein sichbares orangenes Textel und direkt daneben ein durchsichtiges schwarzes Pixel. Wenn das jetzt gestreckt dargestellt wird so entsteht durch die Interpolation ein Farbverlauf. Voon Orange zu Schwarz. Und von Alpha 1 zu 0. Allerdings ist der Alpha erst dann wirklich 0 wenn die Farbe Schwarz ist. Und so lange sieht man wie das Orange gen schwarz driftet und langsam ausgeblendet wird.

Dadurch wird ein verwaschenes dunkles orange in die Textur geschrieben und bei den nächsten Bilder wieder mit in die Berechnung einfließt. Ich könnte mir auch gut vorstellen, dass das Blenden dafür sorgt, dass ein schwarzes Pixel entsteht sobald es keinen Alpha mehr hat. Genau solche Pixel die beim Interpolieren wieder zu verwaschenen Farben führen.

Was man da jetzt gegen tun kann. Keine Ahnung obs wirklich funktioniert. Ich würde aber versuchen das FBO so groß zu machen wie auch das Fenster ist. Dadurch kannst du in dem Fall unnötige Interpolationen vermeiden. Und in der Eingangstextur sollten die Alpha 0 Pixel auch einen Farbwert <> Schwarz haben. Idelaerweise den Durchschnitt aus den umliegenden Pixeln. Dann dürfte beim Interpolieren der schwarze Rand weg sein.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Nov 10, 2009 12:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bergmann89 hat geschrieben:
Hey,

neues Update, das is jetzt die entgültige Version, läuft stabil (hoffe ich), läuft schnell und hat n ordentlich dokumentierten Quelltext...

MfG Bergmann

Es wäre schön, wenn du das nächste Mal auch bei uns bescheid sagt, dass sich dein Problem erledigt hat. Dadurch können zum Beispiel nicht mehr nötige Posts vermieden werden. Der Ein oder Anderen interssiert sich vielleicht auch was du jetzt für eine Lösung genommen hast. Und sei es nur falls später mal jemand ein ähnliches Problem haben solltest. So etwas wäre nur nett....


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Nov 16, 2009 22:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

ich hab seit meinem letzten Post nich viel geändert, ich habs jetzt so gemacht wie Schläfer gesagt hat. Der Grauschleier stört bei meiner Anwendung nich wirklich also werd ich da auch nich weiter dran arbeiten...

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]