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

Aktuelle Zeit: Sa Jun 08, 2024 12:46

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Sep 14, 2012 19:33 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Ich habe gerade festgestellt, dass wenn ich mehrere Polygone hintereinanderlege, die alle samt durchsichtig sind und gleichfarbig sind,
irgendwann keine "absolute undurchsichtigkeit" mehr erreiche.
Stellt man sich 1000 Schichten vor mit einem Alpha-Wert von 0,02 dann kann ich dort immer noch durchschauen. Ich hätte gedacht das dann irgendwann eine "Durchsicht" nicht mehr möglich ist. 1000 * 0.02 ist schließlich 20 auch wenn ich weiß, dass bei 2 schichten mit alpha 0,5 nur ein "Gesamt-Alpha" von 0,75 entsteht.
Kann ich nicht irgendwie erzwingen, dass ich nach einer bestimmten Zahl von Polygonen Undurchsichtigkeit erreiche?

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 14, 2012 21:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 218
Programmiersprache: Lazarus/FPC
Überleg mal:

Sagen wir: Blauer Hintergrund mit 100% Farbe.

Dann kommt das erste Glas davor, Alpha 1 (1/256) sagen wir mal.
Jetzt verändert sich die Farbe um (1/256).
Das ist ein Farbverlust von 1/256.
Also nicht mehr 100% blau, sondern nur mehr 255/256 von 100%, also 95.5 % blau.
und dann...nächstes Glas, dasselbe wieder. 99,5% blau, davon wieder ungefähr mal 99.5% rechen, haben wir 92 oder so.
Usw usw usw, es wird NIE gegen NULL gehen! =D

und zum Zwingen: Schalte nach 1000 Glasscheiben oder so halt einfach Blending aus. Das wirst du schon hinbekommen =)

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 15, 2012 01:54 
Offline
DGL Member

Registriert: Sa Mär 31, 2012 23:14
Beiträge: 26
Programmiersprache: PASCAL
Also, ich könnte mir auch eine Multipass-Lösung mittels Stencilbuffer vorstellen:

1. Pass:
Für Rendern der durchsichtigen Polygone: glStencilMask(not 0), glStencilOp(GL_KEEP, GL_KEEP, GL_INCR) und glStencilFunc(GL_ALWAYS, ...)
So zählt der Stencilbuffer dann für dich, wie viele transparente Polygone sich an jedem Pixel überlappen.

2. Pass:
Die transparenten Objekte nochmals, aber ohne Blending rendern und mit Hilfe des Stencils alle Bildteile ausmaskieren, an denen weniger als X Überlappungen sind:
glStencilOp(3x GL_KEEP), glStencilFunc(GL_GREATER, X, not 0)

Keine Ahnung ob das wirklich das gewünschte Resultat liefert, war nur so 'n Einfall. Hätte auch den Nachteil dass man so im Prinzip einen Großteil des Stencilbuffers "verbraucht" um die Polygone zu zählen.
MfG Yoda

_________________
The force, strong it is in OpenGL.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 15, 2012 10:53 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
evtl. ist es auch realistischer, dass es nicht komplett undurchsichtig ist, denn in der Realität spiegeln Scheiben ja auch etwas und dann ist es auch etwas "blau" oder so.

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 15, 2012 11:17 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Moin, ich muss mich jetzt erst mal um meine Klausuruen kümmern, danach mache ich hier mit weiter.
Danke schon mal für dir Antworten.

Grüße

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 15, 2012 11:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das ist vollkommen realistisch. Die Alphawerte multiplizieren sich nämlich miteinander, bzw. genauer die Transmission T. Transmission T ist in OpenGL 1-Alpha. Das erklärt auch warum du bei zwei alpha = 0.5 Polygonen ein alpha von 0.75 erreichst: T = 0.5, T² = 0.25 ⇒ neues alpha = 0.75.

So funktioniert das auch mit 1000 Polygonen mit Alpha = 0.02: T = 0.98 ⇒ T¹⁰⁰⁰ = 1.68∙10⁻⁹, also α = 0.999999998317.

Da die 1000 Schritte bei OpenGL aber einzeln passieren und sich die Ausgangsfarbe des Fragmentpuffers verändert (ist halt eben nur Blending und keine echte Transparenz), kommt die ursprüngliche Farbe wohl stärker durch als man das von Glasplatten z.B. erwarten würde.

grüße

_________________
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: Sa Sep 15, 2012 16:45 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Lord Horazont hat geschrieben:
Da die 1000 Schritte bei OpenGL aber einzeln passieren und sich die Ausgangsfarbe des Fragmentpuffers verändert (ist halt eben nur Blending und keine echte Transparenz), kommt die ursprüngliche Farbe wohl stärker durch als man das von Glasplatten z.B. erwarten würde.

Und wegen der begrenzten Genauigkeit der Farbwerte würde irgendwann garkeine Veränderung der Farbe mehr stattfinden. Bei 8Bit pro Kanal und einem Alphawert von 0.02 würde das nach spätestens ca 100 Glasscheiben sein. Je nach Kontrast von Hintergrund und Glasfarbe auch früher.

Um diesen Effekt zu verzögern könnte man ein FBO mit mehr als 8Bit pro Kanal verwenden. Also 16Bit oder gleich 32Bit-Floating-Point.
Sinnvoller wäre es allerdings wenn möglich einen höheren Alphawert zu nehmen und weniger Scheiben. Zumal das auch ziemlich an der Füllrate zehren dürfte. Das Problem hat man auch bei Partikeln die großflächig für z.B. Rauch eingesetzt werden. Wobei es da auch einen Lösungsansatz gibt bei dem die Partikel in ein FBO mit geringerer Auflösung gezeichnet werden und danach in die richtige Szene eingefügt werden.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 15, 2012 21:16 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Also was die Realitätsnähe angeht bin ich anderer Meinung, wenn ich mehrere Glasscheiben hintereinanderlege, die alle einen leichten Farbton gleicher Intensität aufweisen, dann sehe ich, je mehr scheiben es werden, die Farbe kräftiger.
Sehe ich in den Himmel, und schaue mir die Wolken an, kann ich bei entsprechender Dichte und Dicke auch nicht mehr durchschauen.

Wie gesagt, ich muss mich später noch mal intensiv damit befassen

Danke für die Hinweise.

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Sep 16, 2012 12:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ja, das war es, worauf ich mit meinem letzten Absatz hinauswollte. Die Realitätsnähe stirbt halt an der Art des Blendings.

_________________
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: So Sep 16, 2012 14:39 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Gibt es denn andere Möglichkeiten als Blending?

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Sep 17, 2012 14:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Keine performancetechnisch realistischen (man könnte selber was mit zwei FBOs bauen). Aber die anderen Lösungen (also weniger Quads nehmen) erscheinen mir schon sinnvoller.

grüße

_________________
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: Di Sep 18, 2012 21:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also ich sehe folgende Möglichkeiten, wobei die ersten beiden hier schon genannt wurden:
1. Deutlich weniger Quads mit entsprechend höheren Alphawerten nehmen.
2. Einen FBO mit 32bit Farbtiefe (Float) pro Kanal benutzen.
3. Die Polygone mit additivem (!) Blending mit Farbwert 1 in einen extra Graustufen-Buffer (8 oder 16bit) rendern. Dann hast du im Buffer die Anzahl der überlappenden Polygone. In einem zweiten Pass (einzelnes Fullscreenquad) kannst du dann mittels Fragmentshader die Anzahl auslesen und irgendeine Formel anwenden. Beispielsweise sowas, gerendert mit Alpha-Blending:
Code:
  1. vec3 farbe = vec3(0.5, 0.5, 1.0); // Grau/Blau
  2. float alpha = 0.02;
  3. alpha = 1.0 - pow(1.0-alpha, anzahl);
  4. gl_FragColor = vec4(farbe, alpha);

Du kannst die Formel natürlich auch entsprechend komplexer gestalten um etwa ab einer gewissen Anzahl auf undurchsichtig zu schalten. Von der Performance her sollte dies nur leicht langsamer wie deine aktuelle Version sein, dafür aber mit der Qualität von 2.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]