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

Aktuelle Zeit: So Jul 20, 2025 08:33

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



Ein neues Thema erstellen Auf das Thema antworten  [ 44 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2003 14:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hmpfff :blink:

Bist du dir auch sicher, das du den Renderkontext vor dem Erstellen des Fonts via ActivateRenderContext(DC,RC) aktiviert hast?
Ansonsten werden deine Displaylisten nämlich nicht erstellt!

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2003 15:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Guest hat geschrieben:
ich benutze gar kein activaterendering context... aber mein namestack zeugs funktioniert ja auch...

Dann halt anders :
Hast du den vorher erstellten Rendercontext vor dem Erstellen des Fonts auch aktiviert?Dies geschieht entweder via ActivateRenderingContext oder wglMakeCurrent.
Irgendwo mußt du den Rendercontest doch aktivieren, ansonsten kanns nicht gehen!

Poste also am besten mal den Initialisierungscode deines Programms.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2003 15:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 14, 2003 23:00
Beiträge: 24
main.pas:

Code:
  1.  
  2. procedure CreateRC;
  3. begin
  4.   //Rendering Context initialisieren
  5.   RC := wglCreateContext(MainForm.Canvas.Handle);
  6.   if (RC=0) then
  7.   begin
  8.     MessageDlg('Rendering Context kann nicht erstellt werden.', mtError, [mbOk], 0);
  9.     Halt(100)
  10.   end;
  11.  
  12.   if (not wglMakeCurrent(MainForm.Canvas.Handle, RC)) then
  13.   begin
  14.     MessageDlg('Rendering Context kann nicht aktiviert werden.', mtError, [mbOk], 0);
  15.     Halt(100)
  16.   end
  17. end; (*StartGL*)
  18.  
  19.  
  20. procedure SetupGL;
  21. begin
  22.   glShadeModel(GL_SMOOTH);
  23.   glClearColor(0.0, 0.0, 0.0, 0.5);
  24.   glClearDepth(1.0);
  25.   glEnable(GL_DEPTH_TEST);
  26.   glDepthFunc(GL_LEQUAL);
  27.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  28. end; (*SetupGL*)
  29.  
  30.  
  31. procedure TMainForm.DrawScene(mode: Integer);
  32. begin
  33.   glMatrixMode(GL_MODELVIEW);
  34.   glClearColor(0,0,0,0);
  35.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  36.  
  37.   glLoadIdentity;
  38.   glTranslatef(0,0,-2);
  39.   glColor3f(1.0, 1.0, 0.0);
  40.   glRasterPos2i(20, 50);
  41.   PrintText2D('abcdefghijklmnwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz');
  42. end;
  43.  
  44.  
  45. procedure TMainForm.FormCreate(Sender: TObject);
  46. begin
  47.   OpenGLInitialized:=false;
  48.   If not LoadOpenGL() then Halt(100);
  49.   //...
  50. end; {*FormCreate*}
  51.  
  52.  
  53. procedure TMainForm.FormShow(Sender: TObject);
  54. begin
  55.   RC:=0;
  56.  
  57.   //pixelformat setzen und rendering context erstellen
  58.   _SetPixelFormat(MainForm.Canvas);
  59.   CreateRC;
  60.  
  61.   //opengl extensions auslesen
  62.   ClearExtensions;
  63.   ReadExtensions;
  64.  
  65.   //initialize glObjects
  66.   glObject[1].id:=1;
  67.   glObject[1].name:='linkes Objekt';
  68.   glObject[2].id:=2;
  69.   glObject[2].name:='zentrales Objekt';
  70.   glObject[3].id:=3;
  71.   glObject[3].name:='rechtes Objekt';
  72.  
  73.   //opengl szene initialisieren
  74.   SetupGL;
  75.  
  76.   Application.OnIdle:=ApplicationEventsIdle;
  77.  
  78.   OpenGLInitialized:=true;
  79.  
  80.   BuildFont2D;
  81. end; {*FormShow*}
  82.  
  83.  
  84. procedure TMainForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  85. var
  86.   error: longint;
  87. begin
  88.   if not OpenGLInitialized then Exit;
  89.  
  90.   done:=false;
  91.  
  92.   //szene zeichnen
  93.   DrawScene(GL_RENDER);
  94.  
  95.   //errorhandler
  96.   error := glgetError;
  97.   if Error<>GL_NO_ERROR then
  98.   begin
  99.     Caption:=gluErrorString(error);
  100.     Done:=true; //rendern kurz anhalten
  101.     FlashWindow(handle, true)
  102.   end;
  103.  
  104.  
  105.   SwapBuffers(Canvas.Handle)
  106. end; (*ApplicationEventsIdle*)
  107.  



font2d.pas:

Code:
  1.  
  2. procedure BuildFont2D;
  3. var
  4.   font, oldfont: HFONT;
  5.  
  6. begin
  7.   //Schriftart erstellen
  8.   Font2DBase := glGenLists(96);
  9.  
  10.   font := CreateFont(16,              // height of font
  11.        0,                             // average character width
  12.        0,                             // angle of escapement
  13.        0,                             // base-line orientation angle
  14.        FW_MEDIUM,                     // font weight
  15.        0,                             // italic
  16.        0,                             // underline
  17.        0,                             // strikeout
  18.        ANSI_CHARSET,                  // character set
  19.        OUT_TT_PRECIS,                 // output precision
  20.        CLIP_DEFAULT_PRECIS,           // clipping precision
  21.        ANTIALIASED_QUALITY,           // output quality
  22.        FF_DONTCARE or DEFAULT_PITCH,  // pitch and family
  23.        'Courier New');                    // font
  24.  
  25.     oldfont := SelectObject(MainForm.canvas.handle, font);
  26.     wglUseFontBitmaps(MainForm.canvas.handle, 32, 96, font2dbase);
  27.     SelectObject(MainForm.canvas.handle, oldfont);
  28.     DeleteObject(font);
  29.  
  30. end; (*Build Font*)
  31.  
  32.  
  33. procedure KillFont2D;
  34. begin
  35.     glDeleteLists(Font2DBase, 96);
  36. end;
  37.  
  38.  
  39.  
  40. procedure PrintText2D(const Text: String);
  41. begin
  42.   if (Text = '') then
  43.     Exit;
  44.   glPushAttrib(GL_LIST_BIT);
  45.     glListBase(Font2DBase - 32);  // Set the base list to our character list
  46.     glCallLists(Length(text), GL_UNSIGNED_BYTE, PChar(Text)); // Display the text
  47.   glPopAttrib()
  48. end; (*PrintText*)
  49.  



_SetPixelFormat(handle: THandle) ist in einer separaten unit... aber das funzt ja sonst würd ich ja nen fehler bekommen oder es würde gar nichts anzeigen...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2003 15:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Also ich sags nochmal, denn es hat schon oft Probleme gemacht.Esetz deshalb MainForm.Canvas.Handle überall durch MainForm.Handle.

Außerdem gibt man Text normalerweise im 2D-Modus (sprich glOrtho) aus.Wechsel also mal vor der Textausgabe in den orthogonalen Modus und versuch den Text nochmal auszugeben.

Wenn das auch nix bringt, dann lad dein Programm mal irgendwo hoch und ich werds mir vielleicht mal genauer ansehen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2003 15:51 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 14, 2003 23:00
Beiträge: 24
dann kann erstens kein RC erstellt werden
und zweitens kommt eine Delphi meldung "Cannot change Visible in OnShow or OnHide"
-> Bild bleibt grau (gar nix passiert)


hab es mal geuppt, wenn du dirs ma anschaust, wär echt nett:
<a href='http://www.2-ways.de/websites/chucky/unused/test.rar' target='_blank'>http://www.2-ways.de/websites/chucky/unused/test.rar</a>


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2003 15:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Werds mir dann mal ansehen...allerdings ist es eine schlechte Idee, den Rendercontext in OnShow zu erstellen, da dort der DC gewechselt wird, und es auch sonst ne schlechte Stelle für Initialisierungen ist, da dieses Ereignis ja z.B. beim Taskswichtung nochmal aufgerufen wird.

Erstelle deinen Rendercontext also im OnCreate-Ereignis und dann sollte die Sache mit dem MainForm.Handle ohne Probs funzen.Vielleicht klappt dann auch die Schriftausgabe!

Edit :
Wäre toll, wenn du auch das richtige Projekt hochgeladen hättest.Ihn dem Projekt das sich hinter deinem Link versteckt, iss nix zum Thema 2D-Font drinne... :angry:

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2003 16:04 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 14, 2003 23:00
Beiträge: 24
rofl ich depp.. so habs jetzt geuppt.. sorry :/ lag daran weil ich die beiden projekte gleich benannt hab ...

geht auch nich wenn ichs im oncreate hab :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2003 16:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Naja, wie ich in meinem letzten Posting gesagt hab!
Schalt vor der Textausgabe in den Orthomodus, und die Sache funzt ohne Probleme :
Code:
  1.  
  2. [...]
  3. glMatrixMode(GL_PROJECTION);
  4. glLoadIdentity;
  5. glOrtho(0,640,480,0,-2,2);
  6. glMatrixMode(GL_MODELVIEW);
  7. glColor3f(1.0, 1.0, 1.0);
  8. LineOut(5, 6,'Hilfe:');
  9. glColor3f(1.0, 1.0, 0.0);
  10. glRasterPos2i(20, 50);
  11. PrintText2D('abcd');
  12. [...]
  13.  

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2003 16:19 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Also, ich hatte mit Canvas auch Probleme. Hab' dann einen eigenen DC erstelle (GetDC(Form.Handle)) und ab da keinerlei Probleme mehr. Font darstellen ging bei mir mit VCL, aber nur wenn ich mit Hilfe von glOrtho eben die Ortho-Matrix gesetzt hab. Sonst hab' ich auch keine Schrift angezeigt bekommen. Die Schrift im Projection-Matrix Modus anzuzeigen Funktioniert wohl nur mit OutlinedFont. Würd' ich aber für die Normale Text-Ausgabe nicht empfehlen, da hier keine Quads zur Darstellung sondern richtige 3D-Objekte verwendet werden. Dadurch leidet die Performance und der verwendete Speicher. Als OutlinedFont nur dann verwenden, wenn's auch Sinn macht!

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2003 16:40 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 14, 2003 23:00
Beiträge: 24
cool jetzt gehts.. danke :)

allerdings beisst sich das jetzt mit der namestack funktion getselectedbufferhit...
bekomme accessviolations

liegt aber daran dass ich irgendwie glOrtho mach
wie kann ich denn den view zurücksetzen wie er war? mit push und pop klappts irgendwie nich


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2003 17:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das Problem war bei mir auch.Das hat aber nix mit glOrtho zu tun, sondern der Tatsache das deine Schrift ja auch ein Objekt darstellt und diese beim Klick einen Namen zurückliefert.
Dieser ist dann aber ungültig und ihm ist ja logischerweise kein Platz in deinem glObject-Array zugewiesen.Also führt das beim Klick auf die Schrift zu nem Überschreiten deiner Arraygrenzen.

Umgehen lässt sich das aber ganz einfach indem du vor dem Ausgeben der Schrift mittels glPushName(0); ne 0 auf den Namestack legst.Das müsste einwandfrei funzen!

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2003 17:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 14, 2003 23:00
Beiträge: 24
jepp, fehler weg, aber getselectedbufferhit gibt jetzt nur noch -1 zurück.. mach ich wohl irgendwas mit push und pop matrix falsch oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2003 17:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das sollte funzen :
Code:
  1.  
  2. [...]
  3. if Mode <> GL_SELECT then
  4.  begin
  5.  glMatrixMode(GL_PROJECTION);
  6.  glPushMatrix;
  7.  glMatrixMode(GL_MODELVIEW);
  8.  glPushMatrix;
  9.  
  10.  // Text ausgeben
  11.  
  12.  glMatrixMode(GL_PROJECTION);
  13.  glPopMatrix;
  14.  glMatrixMode(GL_MODELVIEW);
  15.  glPopMatrix;
  16. end;
  17. [...]
  18.  

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


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


Wer ist online?

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