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

Aktuelle Zeit: Fr Jul 18, 2025 05:43

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: OpenGL Command States
BeitragVerfasst: Fr Aug 22, 2003 10:45 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Kennt ihr nicht auch das problem, ihr programmiert irgendwas mit OpenGL was schon etwas komplexer ist, benutzt blend modis, texture1d, texture2d, texture3d, Texgen und andere sachen.

Wenn ihr jetzt irgendwo vergessen habt ne texture zu deaktivieren, dann funzt z.b. das ganze nich mehr richtig, jetzt wäre es z.b. sinnvoll um solche fehler vermeiden, das die OpenGL States nachdem ihr sie aktiviert habt wieder zurückgesetzt werden, auch blend operationen oder so.

Ich weiss das geht glaub ich über glPushAttrib und popAttrib... aber wie ich gelesen habe sollen diese nicht so oft benutzt werden. Aber da kann man ja nur einstellen, was enabled und disabled ist... wie ist es mit Blend operationen oder Texgen operationen, oder TexEnv operationen... ?

Wäre da nicht sinnvoll mal eine klasse für zu schreiben wo dieses für uns übernimmt ? Natürlich aber nur die sachen was wir wollen ;)

Also ich versuche mal nen beispiel zu machen wie ich mir das vorstelle:

Code:
  1.  
  2.  
  3. // Initialisieren von unserer Anwendung
  4. procedure glInit;
  5. begin
  6.   // Alle OpenGL States auf standard setzten
  7.   OGLStates.Clear;
  8. end;
  9.  
  10. // Unsere Procedure zum Rendern
  11. procedure DrawLight;
  12. begin
  13.  
  14.   // Pass 1 (PerPixelLighting)
  15.   OGLStates.Enable(GL_BLEND);
  16.   OGLStates.BlendOperation(GL_ONE, GL_ONE);
  17.   OGLStates.Enable(GL_TEXTURE_3D);
  18.   OGLStates.TexGen(True);
  19.   OGLStates.BindTexture(GL_TEXTURE_3D, TexLightIntensity);
  20.   DrawPolys(PERPIXELLIGHT); // Polygone rendern
  21.   OGLStates.Reset; // Alles wieder auf standard setzten.
  22.  
  23.   // Pass 2 (Normale Texture)
  24.   OGLStates.Enable(GL_BLEND);
  25.   OGLStates.BlendOperation(GL_DST_COLOR, GL_ZERO);
  26.   OGLStates.Enable(GL_TEXTURE_2D);
  27.   OGLStates.BindTexture(GL_TEXTURE_2D, BaseTexture);
  28.   DrawPolys(BASE); // Polygone rendern
  29.   OGLStates.Reset; // Alles wieder auf standard setzten.
  30.  
  31.   // Pass 3
  32.   DrawLights; // Sphere oder Blend/Texturen rendern
  33.  
  34. end;
  35.  


ungefähr so, sollte natürlich noch complexer sein als so.
Wie man das aber auch mit BindTexture machen soll, da hätte ich jetzt keine idee.

Jetzt frag ich mal... wäre sowas sinnvoll... ?

mata,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 22, 2003 10:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
Ich weiss das geht glaub ich über glPushAttrib und popAttrib... aber wie ich gelesen habe sollen diese nicht so oft benutzt werden. Aber da kann man ja nur einstellen, was enabled und disabled ist... wie ist es mit Blend operationen oder Texgen operationen, oder TexEnv operationen... ?

Das ist falsch.Schau dir mal die glManPage zu glPushAttrib an, dort wird genau gesagt was mit jedem Push-BIT so auf den Attributstack gelegt wird.Beim GL_TEXTURE_BIT wird folgendes auf den Stack gelegt : Alle vier Texturkoordinaten, Randfarbe, Verkleinerungs- und Vergrößerungsfunktion, Wrapmodus, Farb- und Blendmodus der Texturenumgebung, und noch vieles mehr.Dort wird also weitaus mehr gemacht als den Status Enabled oder Disabled zu speichern.
Und diese Funktion ist meiner Meinung nach IMMER schneller als wenn du es selbst machst!Wenn du z.B. via GL_ALL_ATTRIB_BITS alle Attribute sichern willst, wirds logischerweise sehr langsam, da dann hunderte Attribute gesichert werden müssen, aber ich bin mir fast sicher das es dann trotzdem noch schneller ist als wenn du diese Attribute alle per Hand sicherst.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 22, 2003 11:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich befürchte dadurch allerdings auch, dass man sich damit selber ins Knie schießen würde.
Einfaches Beispiel. Ich muss ja nicht für jede 2DTextur vorher glEnable und hinterher wieder glDisable aufrufen. Es reicht ja, wenn ich eine 1D o. 3D Textur benutzen will, dass ich dann die 2D Disable. Sofern du bei 2DTexturen bleibst genügt es vollkommen die neue Textur zu binden. Du musst die Alte ja nicht erst entfernen. Oder das Blenden. Es würde ja reichen wenn ich es Disable da muss man ja die BlendFunc nicht löschen. Eine Handoptimierung finde ich da effizienter.

PS: Um eine Textur wieder los zu werden brauchst du lediglich die ID 0 binden.
Code:
  1. glBindTexture(GL_TEXTURE_2D, 0);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 22, 2003 11:39 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Am bequemsten ist es, wenn man die ganzes States in einem Shader speichert, und dann aus einer Datei ausliest. Da kann man dann auch gleich noch mit angeben welches Vertex und Fragment Program benutzt wird. Natürlich sollte man nur die Werte ändern, die der Shader auch benutzt. Außerdem kann man dann in den Shader auch mit hineinschreiben welche Texturen zu welcher OpenGL Texture gebunden werden sollen. Dann kann man sich solche OpenGL Befehle, die den Status verändern, fast ganz sparen und das Rendern vereinfacht sich auf folgenden Ablauf.

Shader1 aktivieren
Zeichnen
Shader1 Deaktivieren

Shader2 aktivieren
Zeichnen
Shader1 Deaktivieren

Anstelle Shader1 zu deaktivieren und Shader2 zu aktivieren, kann man auch nur die States verändern, die sich bei beiden Shadern unterscheiden.


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 » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.007s | 14 Queries | GZIP : On ]