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

Aktuelle Zeit: Fr Jul 18, 2025 08:18

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: OGL-Source aufräumen
BeitragVerfasst: So Apr 12, 2009 20:27 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 20:52
Beiträge: 43
Programmiersprache: Delphi
Hallo und frohe Ostern,

ich mach mich gerade an die Weiterentwicklung von Heiliger Damm, aber irgendwie ist mir der Source zu durcheinander und überfüllt. Könnt ihr mal durchgucken ob ich das alles brauche und das auch in der richtigen Reihenfolge ist? Es ist ja nur ein 2D-Modus nötig:

Code:
  1. procedure CreateRenderContext;
  2. begin
  3.   DC := GetDC(MainForm.Handle);
  4.  
  5.   if not InitOpenGL then MainForm.Close;
  6.  
  7.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  8.   ActivateRenderingContext(DC, RC);
  9.  
  10.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  11.   glEnable(GL_BLEND);
  12.  
  13.   glEnable(GL_TEXTURE_2D);           
  14.   glShadeModel(GL_SMOOTH);           
  15.   glClearColor(0.0, 0.0, 0.0, 0.5);  
  16.   glClearDepth(1.0);                 
  17.   glEnable(GL_DEPTH_TEST);           
  18.   glDepthFunc(GL_LEQUAL);                
  19.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  20.   glEnable(GL_LIGHTING);
  21. end;


Code:
  1. procedure TMainForm.FormResize(Sender: TObject);
  2. var
  3.   L, T: Integer;
  4. begin
  5.   L := (ClientWidth div 2) - 400;
  6.   T := (ClientHeight div 2) - 300;
  7.  
  8.   RcWidth  := ClientWidth;
  9.   RcHeight := ClientHeight;
  10.  
  11.   glViewPort(L, T, 800, 600);
  12.  
  13.   glMatrixMode(GL_PROJECTION);
  14.   glLoadIdentity;
  15.  
  16.   glOrtho(L, L + 800, L + 600, 0, 1, 128);
  17.  
  18.   glEnable(GL_SCISSOR_TEST);
  19.   glScissor(L, T, 800, 600);
  20.  
  21.   glMatrixMode(GL_MODELVIEW);
  22.   glLoadIdentity;
  23.  
  24.   glClear(GL_COLOR_BUFFER_BIT);
  25. end;


Code:
  1. procedure Render;
  2. begin
  3.   glClearColor(R,G,B,A);
  4.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5.   glMatrixMode(GL_MODELVIEW);
  6.   glLoadIdentity;
  7.  
  8.   glEnable(GL_TEXTURE_2D);
  9.   glEnable(GL_ALPHA_TEST);
  10.  
  11.   L := (RcWidth / 2) - 400;
  12.   T := (RcHeight / 2) - 300;
  13.  
  14.   glPushAttrib(GL_DEPTH_BUFFER_BIT or GL_ENABLE_BIT);
  15.   glEnable(GL_CULL_FACE);
  16.   glCullFace(GL_BACK);
  17.  
  18.   glDisable(GL_LIGHTING);
  19.   glDisable(GL_TEXTURE_2D);
  20.  
  21.   glMatrixMode(GL_PROJECTION);
  22.     glPushMatrix();
  23.       glLoadIdentity();
  24.  
  25.         glOrtho(0, 800, 600, 0, 0, 128);
  26.  
  27.         glMatrixMode(GL_MODELVIEW);
  28.  
  29.         glPushMatrix();
  30.           glLoadIdentity();
  31.  
  32.       glPushMatrix;
  33.         glTranslated(0, 0, 0);
  34.  
  35.         case rs_CurrentState of
  36.            // ...
  37.         end;
  38.  
  39.       glPopMatrix;
  40.         glMatrixMode(GL_PROJECTION);
  41.         glPopMatrix();
  42.  
  43.       glMatrixMode(GL_MODELVIEW);
  44.       glPopMatrix();
  45.   glPopAttrib()
  46.  
  47.   SwapBuffers(DC);
  48. end;


Bissl Ordnung im System wäre nicht schlecht :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 13, 2009 12:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Code:
  1. glEnable(GL_SCISSOR_TEST);
  2. glScissor(L, T, 800, 600);

Du brauchst kein Scissor-Test, wenn der Viewport genauso groß ist.

Ich nehme mal an deine Projektions-Matrix ändert sich nie. Daher brauchst du die auch nur einmal am Anfang zu setzen, bzw. nur immer dann wenn sich die Größe des Viewport ändert.

Sofern du nur diese Render-Methode hast kannst du auch gefahrlos die Modelview-Matrix nur einmal auf glLoadIdentity(); setzen und massenhaft sinnfreie glPush/glPopMatrix einsparen.

Das glPush/glPopAttrib brauchst du nicht, wenn du sowieso alles wieder neusetzt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 13, 2009 13:00 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 20:52
Beiträge: 43
Programmiersprache: Delphi
So, mit deiner und mit der Hilfe von Seth, bin ich jetzt soweit:

Code:
  1. procedure CreateRenderContext;
  2. begin
  3.   DC := GetDC(MainForm.Handle);
  4.  
  5.   if not InitOpenGL then
  6.     MainForm.Close;
  7.  
  8.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  9.   ActivateRenderingContext(DC, RC);
  10.  
  11.   // Alpha-Test und Blending
  12.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  13.   glEnable(GL_BLEND);
  14.   glEnable(GL_ALPHA_TEST);
  15.  
  16.   // Rückseiten nicht zeichnen
  17.   glEnable(GL_CULL_FACE);
  18.   glCullFace(GL_BACK);
  19.  
  20.   // Textur-Mapping und Shading
  21.   glEnable(GL_TEXTURE_2D);
  22.   glShadeModel(GL_SMOOTH);
  23.  
  24.   // Standardfarbe: Schwarz
  25.   glClearColor(0.0, 0.0, 0.0, 0.5);
  26.   glClearDepth(1.0);
  27.  
  28.   glEnable(GL_DEPTH_TEST);
  29.   glDepthFunc(GL_LEQUAL);
  30.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  31. end;


Code:
  1. procedure TMainForm.FormResize(Sender: TObject);
  2. begin
  3.   RcWidth  := (ClientWidth div 2) - 400;
  4.   RcHeight := (ClientHeight div 2) - 300;
  5.  
  6.   glViewPort(RcWidth, RcHeight, 800, 600);
  7.  
  8.   glMatrixMode(GL_MODELVIEW);
  9.   glLoadIdentity();
  10.  
  11.   glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);
  12. end;


Code:
  1. procedure Render;
  2. begin
  3.   glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);
  4.  
  5.   glMatrixMode(GL_PROJECTION);
  6.   glLoadIdentity();
  7.  
  8.   glOrtho(0, 800, 600, 0, 0, 128);
  9.  
  10.   glMatrixMode(GL_MODELVIEW);
  11.   glLoadIdentity();
  12.  
  13.   glPushMatrix;
  14.  
  15.     case rs_CurrentState of
  16.       // ...
  17.     end;
  18.  
  19.   glPopMatrix;
  20.  
  21.   SwapBuffers(DC);
  22. end;


glOrtho ändert sich ja nicht und bleibt auf 800x600. Reicht dann der Teil in OnResize so?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 13, 2009 13:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Das glPushMatrix und glPopMatrix kannst du dir auch sparen, du greifst ja nach dem Pop nichtmehr auf die Matrix zu, wozu sie also speichern..?

Und wie gesagt, das setzen der Ortho-Projektion reicht im resize, sprich das braucsht du im Render-loop auch nicht jedesmal tun ;)

Code:
  1. procedure Render;
  2. begin
  3.   glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);
  4.   glLoadIdentity();
  5.   case rs_CurrentState of
  6.     // ...
  7.   end;
  8.   SwapBuffers(DC);
  9. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 14, 2009 07:53 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 20:52
Beiträge: 43
Programmiersprache: Delphi
Danke. Von 48 auf 10 Zeilen in Render; macht das ganze deutlich übersichtlicher :)


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


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 | 16 Queries | GZIP : On ]