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

Aktuelle Zeit: Fr Mär 29, 2024 08:51

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Einmaliges Blending
BeitragVerfasst: Mi Mai 20, 2015 20:00 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Hallo, diesmal eine etwas andere Frage und zwar mehr der theoretischen Natur.
Ich würde gerne wissen, wie man Blending nur für einen DrawCall benutzt/umschaltet. Heißt, ich habe ein Standard-Blending das für die meisten Anwendungsfälle genügt. Aber für spezifische Draws möchte ich ein anderes Blending, um die Texture bspw. halbwegs durchsichtig erscheinen zu lassen. Für alle anderen Texturen möchte ich allerdings das Standard-Blending. Wie mache ich sowas am geschicktesten?
Mir fallen da zwei mögliche Lösungen ein, die mir aber nicht 100% gefallen:
  • Ich setze per glBlendFunc und glBlendEquation ein neues Blending, zeichne und rufe dann nochmal beide Funktionen auf, um das Standardverhalten wiederherzustellen. Nachteil: Doppelter Aufruf.
  • Ich benutzt glPushAttrib(GL_COLOR_BIT). Dann kann ich ein neues Blending setzen und es wird dank eines Aufrufs von glPopAttrib für alle nachfolgenden Zeichnungen das Standard Blending genommen. Erscheint mich aber irgendwie veraltet.
Wie würdet ihr das lösen? OpenGL hat eben den Nachteil, das alles eine riesen State-Maschine ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Einmaliges Blending
BeitragVerfasst: Do Mai 21, 2015 10:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Hi, ja das ist etwas nervig. Am besten du machst dir etwas wie das folgende:
Code:
  1.  
  2. struct SurfaceStyle {
  3.       ...
  4.       bool shouldUseBlend;
  5.       int blendModeParam1;
  6.       int blendModeParam2;
  7. }
  8.  
  9. struct Surface {
  10.      SurfaceStyle style;
  11. }
  12.  
  13. Dictionary<SurfaceStyle,List<Surface>> StyledSurfaces; //Wenn du Enums fuer den Style benutzt kann das hier ein Array sein und du kannst ausserdem die Reihenfolge festlegen.
  14. //das saehe dann z.B. so aus:
  15. struct SurfaceChain { //Linked List macht sich leichter
  16.     Surface Head;
  17.     SurfaceChain Tail; //solange durchgehen bis Tail = NULL wird.
  18. }
  19. SurfaceChain StyledSurfaces[NUM_SURFACE_STYLES];
  20.  
  21. void DrawSurfs(List<Surface> sds) {
  22.      foreach(Surface sd in sds) {
  23.          if(sd.style != DefaultStyle) {
  24.               StyledSurfaces[sd.Style].Add(sd);
  25.          }
  26.      }
  27. }
  28.  
  29. void DrawSurfsStyled(List<Surface> sds) {
  30.      foreach(Surface sd in sds) {
  31.          sd.Draw();
  32.      }
  33. }
  34.  
  35.  
  36. void DrawFrame(void) {
  37.     ResetStyle();
  38.     ...
  39.     DrawSurfs(CurrentSurfs);
  40.     foreach(KeyValuePair<SurfaceStyle,List<Surface>> kv in StyledSurfaces) {
  41.          ApplyStyle(kv.Key);
  42.          DrawSurfaceStyled(kv.Value);
  43.     }
  44. }
  45.  


laesst sich natuerlich noch Optimieren usw. aber ich denke das Prinzip wird deutlich.

Ein Tipp: Mach dir eine globale Variable fuer den OpenGL State. Dann brauchst du nicht immer Push und Pop benutzen.

Idealerweise kriegst du dann so etwas wie die SurfaceBuffer von Quake 3 und kannst Parallel Arbeiten.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Einmaliges Blending
BeitragVerfasst: Do Mai 21, 2015 12:05 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Wenn ich dich richtig verstehe, meinst du (ganz simpel ausgedrückt) in jedem Frame das Blending auf das Default resetten und bei jedem zeichnen den Surface Style/Blending anwenden.
Also überschreibt jeder DrawCall das Blending des vorherigen bzw. (wenn kein Blending für den momentanen angewendet werden soll) hat der vorherige noch Einfluss auf den nachfolgenden.
Versteh' ich das richtig? :wink:

Die Linked List lasse ich erstmal außen vor, damit ich dein Grundprinzip verstehe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Einmaliges Blending
BeitragVerfasst: Fr Mai 29, 2015 11:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
rswhite hat geschrieben:
Wenn ich dich richtig verstehe, meinst du (ganz simpel ausgedrückt) in jedem Frame das Blending auf das Default resetten und bei jedem zeichnen den Surface Style/Blending anwenden.
Also überschreibt jeder DrawCall das Blending des vorherigen bzw. (wenn kein Blending für den momentanen angewendet werden soll) hat der vorherige noch Einfluss auf den nachfolgenden.
Versteh' ich das richtig? :wink:

Die Linked List lasse ich erstmal außen vor, damit ich dein Grundprinzip verstehe.

Sorry fuer die spaete Antwort (voellig vergessen :))

Ja, der aktuelle "Status" bleibt solange erhalten bis du Ihn aenderst und gilt dann fuer die nachfolgenden Draw Calls. Solche Geschichten findest du nicht nur beim
Blending sondern auch bei Texturen, Shader, VBOs oder Matrizen usw.. Halt im Prinzip alle GL-Objekte. Da solche Statusaenderungen sehr teuer sind und
man manchmal etwas vergisst, solltest du dir also etwas bauen was deine Vertexdaten sortiert und dir eine zentrale Pflege erlaubt.

_________________
Meine Homepage


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 11 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.063s | 16 Queries | GZIP : On ]