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

Aktuelle Zeit: Fr Jul 18, 2025 23:22

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Text wird nicht angezeigt
BeitragVerfasst: Sa Mär 31, 2007 19:29 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Hallo,

in Englisch sollen wir irgendeine kreative Arbeit vollbringen zum Theman Globalisierung. Sie hatte zum Beispiel vorgeschlagen, dass wir uns ein Gedicht bzw. Lied ausdenken. Da ich dazu keine Luste habe, will ich ne OGL-Animation machen (damit ich OpenGl nicht verlerne :mrgreen: ).
Nun ja: Ich scheitere gerade am Text. IMHO sollte der ausgegeben werden, aber leider tut er das nicht. Ich bekomme auch kein OGL-Fehler zurückgeliefert :(.

Code:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, dglOpengl, Math;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     procedure FormCreate(Sender: TObject);
  12.     procedure FormDestroy(Sender: TObject);
  13.     procedure FormResize(Sender: TObject);
  14.     procedure FormPaint(Sender: TObject);
  15.     procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  16.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  17.     procedure FormActivate(Sender: TObject);
  18.   private
  19.     { Private-Deklarationen }
  20.     procedure SetOpenGLSettings;
  21.     procedure DrawDefaultWorld;
  22.   public
  23.     { Public-Deklarationen }
  24.   end;
  25.  
  26. var
  27.   Form1: TForm1;
  28.   DC   : HDC  ;
  29.   RC   : HGLRC;
  30.   Break: Boolean = false;
  31.   FontLists: Cardinal;
  32.  
  33. implementation
  34.  
  35. {$R *.dfm}
  36.  
  37. procedure TForm1.FormActivate(Sender: TObject);
  38. begin
  39.  { BorderStyle:=bsNone;
  40.   WindowState:=wsMaximized;
  41.   ShowCursor(false) }
  42. end;
  43.  
  44. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  45. begin
  46.   Break:=true;
  47. end;
  48.  
  49. procedure TForm1.FormCreate(Sender: TObject);
  50. const
  51.   MemoryDCs = [OBJ_MEMDC, OBJ_METADC, OBJ_ENHMETADC];
  52. var
  53.   pfd  : TPixelFormatDescriptor;
  54.   pf   : Integer;
  55.   AType: DWORD;
  56.   Error: Boolean;
  57. begin
  58.   Error:=true;
  59.  
  60.   DC   := GetDC(Handle);
  61.   RC   := 0;
  62.   if DC<>0 then
  63.   begin
  64.     if InitOpenGL then
  65.     begin
  66.       AType:= GetObjectType(DC);
  67.       if AType<>0 then
  68.       begin
  69.         ZeroMemory(@pfd, SizeOf(TPixelFormatDescriptor));
  70.         with pfd do
  71.         begin
  72.           nSize   := SizeOf(TPixelFormatDescriptor);
  73.           nVersion:= 1;
  74.           dwFlags := PFD_SUPPORT_OPENGL;
  75.           if AType in MemoryDCs then dwFlags:= dwFlags or PFD_DRAW_TO_BITMAP
  76.                                 else dwFlags := dwFlags or PFD_DRAW_TO_WINDOW;
  77.           dwFlags := dwFlags or PFD_DOUBLEBUFFER;
  78.           iPixelType   := PFD_TYPE_RGBA;
  79.           cColorBits   := 32;
  80.           cDepthBits   := 24;
  81.           cStencilBits := 0;
  82.           cAccumBits   := 0;
  83.           cAuxBuffers  := 0;
  84.           iLayerType := PFD_MAIN_PLANE;
  85.         end;
  86.         pf := ChoosePixelFormat(DC, @pfd);
  87.         if pf<>0 then
  88.         begin
  89.           if GetPixelFormat(DC) <> pf then
  90.           begin
  91.              if SetPixelFormat(DC, pf, @pfd) then
  92.              begin
  93.                DescribePixelFormat(DC, pf, SizeOf(TPixelFormatDescriptor), pfd);
  94.                RC := wglCreateContext(DC);
  95.              end;
  96.           end
  97.           else
  98.           begin
  99.             DescribePixelFormat(DC, pf, SizeOf(TPixelFormatDescriptor), pfd);
  100.             RC := wglCreateContext(DC);
  101.           end;
  102.           if RC<>0 then
  103.           begin
  104.             if wglMakeCurrent(DC, RC) then
  105.             begin
  106.               ReadExtensions;
  107.               ReadImplementationProperties;
  108.  
  109.               SetOpenGLSettings;
  110.               Font.Style:=[fsBold];
  111.               Font.Size:=25;
  112.               SelectObject(DC, Canvas.Font.Handle);
  113.               wglUseFontBitmaps (DC, 0, 255, FontLists);
  114.               glListBase(FontLists);
  115.  
  116.               Error:=false;
  117.             end
  118.             else wglMakeCurrent(DC, 0);
  119.           end
  120.         end
  121.       end
  122.     end
  123.   end;
  124.   if error then
  125.   begin
  126.     Application.MessageBox('Der Rendercontext konnte nicht erstellt werden!',
  127.                            'Fehler', 16);
  128.     halt;
  129.   end;
  130. end;
  131.  
  132. procedure TForm1.FormDestroy(Sender: TObject);
  133. begin
  134.   wglMakeCurrent(DC, 0);
  135.   wglDeleteContext(RC);
  136.   ReleaseDC(Handle, DC);
  137. end;
  138.  
  139. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  140.   Shift: TShiftState);
  141. begin
  142.   if Key=VK_F10 then
  143.   begin
  144.     if BorderStyle = bsNone then
  145.     begin
  146.       BorderStyle:=bsSizeable;
  147.       WindowState:=wsNormal;
  148.     end
  149.     else
  150.     begin
  151.       BorderStyle:=bsNone;
  152.       WindowState:=wsMaximized;
  153.     end;
  154.   end;
  155. end;
  156.  
  157. procedure TForm1.SetOpenGLSettings;
  158. begin
  159.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
  160.   glDepthFunc(GL_LEQUAL);
  161.   glEnable(GL_DEPTH_TEST);
  162.   glEnable(GL_CULL_FACE);
  163.   glDepthMask(True);
  164.   glClearDepth(1);
  165.   glDisable(GL_BLEND);
  166.   glDisable(GL_ALPHA_TEST);
  167.   glEnable(GL_COLOR_MATERIAL);
  168.  
  169.   glClearColor(0.66, 0.84, 1, 0);
  170. end;
  171.  
  172. procedure TForm1.FormPaint(Sender: TObject);
  173. var
  174.   t, tb, tbc: Cardinal;
  175. begin
  176.   OnPaint:=nil;
  177.   t:=GetTickCount;
  178.   tb:=0;
  179.   tbc:=0;
  180.   while (not Break) and (tb<5000) do
  181.   begin
  182.     glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT );
  183.     glCallLists(13, GL_UNSIGNED_BYTE, PChar('Globalization'));
  184.     Form1.Caption:=gluErrorString(glGetError);
  185.     SwapBuffers(DC);
  186.    
  187.     tbc:=GetTickCount-t-tb;
  188.     inc(tb, tbc);
  189.     Application.ProcessMessages;
  190.   end;
  191.  
  192.   tb:=0;
  193.   tbc:=0;  
  194. {  while (not Break) and (tb<5000) do
  195.   begin
  196.  
  197.     glTranslatef(-tbc/5000, 0, 0);
  198.     DrawDefaultWorld;
  199.     SwapBuffers(DC);
  200.  
  201.     tbc:=GetTickCount-t-tb;
  202.     inc(tb, tbc);
  203.     Application.ProcessMessages;
  204.   end; }
  205. end;
  206.  
  207. procedure TForm1.FormResize(Sender: TObject);
  208. var
  209.   CS: array[0..1] of Integer;
  210.   DWidth, DHeight: Integer;
  211. begin
  212.   glGetIntegerv(GL_MAX_VIEWPORT_DIMS, @CS);
  213.   DWidth :=  Min(CS[0], Width);
  214.   DHeight := Min(CS[1], Height);
  215.  
  216.   glViewport(0, 0, DWidth, DHeight);
  217.  
  218.   glMatrixMode(GL_PROJECTION);
  219.   glLoadIdentity();
  220.  
  221.   glOrtho(0, 1, 0, Width/Height, -1, 1);
  222.  
  223.   glMatrixMode(GL_MODELVIEW);
  224.   glLoadIdentity();
  225. end;
  226.  
  227. procedure TForm1.DrawDefaultWorld;
  228. var
  229.   i: integer;
  230. begin
  231.   glColor3ub(0, 196, 0);
  232.   glBegin(GL_QUADS);
  233.     glVertex2f(0, 0);
  234.     glVertex2f(5, 0);
  235.     glVertex2f(5, 0.25);
  236.     glVertex2f(0, 0.25);
  237.   glEnd;
  238.   glColor3ub(196, 196, 196);
  239.   glBegin(GL_QUADS);
  240.     glVertex2f(0, 0.0625);
  241.     glVertex2f(5, 0.0625);
  242.     glVertex2f(5, 0.1875);
  243.     glVertex2f(0, 0.1875);
  244.   glEnd;
  245.   glColor3ub(255, 255, 255);
  246.   glBegin(GL_QUADS);
  247.   for i := 0 to 127 do
  248.   begin
  249.     glVertex2f(i*0.02      , 0.1225);
  250.     glVertex2f(i*0.02+0.01 , 0.1225);
  251.     glVertex2f(i*0.02+0.012, 0.1275);
  252.     glVertex2f(i*0.02+0.002, 0.1275);
  253.   end;
  254.   glEnd;
  255. end;
  256.  
  257. end.


Sieht einer von euch den Fehler? Ach so, wo ich gerade bei TExt bin: Gibts die Möglichkeit ihn zentriert anzufassen, so wie es mitm Canvas möglich ist (durch die OGL-Listen wird das ja bestimmt nicht gehen)?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 01, 2007 10:10 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
glPushAttrib(GL_ALL_ATTRIB_BITS); und glPopAttrib hat gefehlt ;). Habe ich gerade mitbekommen, nachdme ich mir von einem anderem die Unit angeguckt hatte. Schade, dass es im wiki nicht dazustand :(.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 01, 2007 11:29 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Gibt es eigentlich die Möglichkeit, die Position zu reseten? Denn glRasterPos ist bei mir leider teilweise ungeeignet, da es scheinbar ein bissl Bildschirmgrößenabhängig ist (oder Schriftgrößenabhängig...)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 01, 2007 12:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wie meinst du das mit glRasterPos? Das was du dort übergibst richtet sich danach was du bei glOrtho übergeben hast. Und du übergibst dort Werte zwischen 0 und 1. Wenn du jetzt das Fenster vergrößerst ist es vollkommen logisch, dass sich die Abstände zwischen dem Text verändern, da 0.1 vorher irgendwas an die 64 Pixel war und jetzt auf einmal 80 Pixel sind.

Bei glOrtho finde ich es am Besten, wenn man die genau Höhe des Fensters abgibt. In wenigen Fällen mag das auch Sinn machen aber bei Text etc arbeite ich immer mit den genauen Fenstergrößen. Das ist zu mindest meine Meinung.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 01, 2007 12:54 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Wenns nur text wäre, wäre es sicherlich besser. Nur habe ich später dann noch Bilder, die somit automatisch an die Größe des Fensters skaliert werden sollten (was auch passiert) ;).

Gibts da irgendeine Variante, den Text zu zentrieren (also zu 0,5)?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 01, 2007 13:14 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Mhm, das Problem gefunden ;). Durch diese beiden zeile hier

Code:
  1. wglUseFontBitmaps (DC, 0, 255, FontLists);
  2. glListBase(FontLists);

Hat sich das ganze schon verschoben. Und da diese beiden Zeilen beim verändern der Fenstergröße aufgerufen wurden, gabs dem entsprechend verschiebungen, die ich nicht wollte...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 02, 2007 18:23 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
So langsam verzweifle ich an der Schrift. Sie funktioniert jetzte so, wie ich es will, aber über Wege, di9e nicht gerade schön sind :(:

Code:
  1. procedure SetFontSize(FontSize: Integer);
  2. begin
  3.   glPushAttrib(GL_ALL_ATTRIB_BITS);
  4.     CurFontSize:=FontSize;
  5.     Form1.Canvas.Font.Height:=round(FontSize*Form1.ClientWidth/500);
  6.     SelectObject(DC, Form1.Canvas.Font.Handle);
  7.     wglUseFontBitmaps (DC, 0, 255, FontLists);
  8.     glListBase(FontLists);
  9.   glPopAttrib;
  10. end;
  11.  
  12. procedure TForm1.FormPaint(Sender: TObject);
  13. var
  14.   t, tb, tbc: Cardinal;
  15. begin
  16.   OnPaint:=nil;
  17.   FormResize(Sender);
  18.   SetFontSize(75);
  19.   t:=GetTickCount;
  20.   tb:=0;
  21.   tbc:=0;
  22.   while (not Break) and (tb<2500) do
  23.   begin
  24.     glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT );
  25.     glColor3ub(tb*196 div 2500, tb*196 div 2500, tb*255 div 2500);
  26.     glPushAttrib(GL_ALL_ATTRIB_BITS);
  27.       glRasterPos2f(0.12, 0.5);
  28.       glCallLists(13, GL_UNSIGNED_BYTE, PChar('...'));
  29.     glPopAttrib;
  30.  
  31.     SwapBuffers(DC);
  32.  
  33.     tbc:=GetTickCount-t-tb;
  34.     inc(tb, tbc);
  35.     Application.ProcessMessages;
  36.   end;
  37. ...
  38. end;
  39.  
  40. procedure TForm1.FormResize(Sender: TObject);
  41. var
  42.   CS: array[0..1] of Integer;
  43.   DWidth, DHeight: Integer;
  44. begin
  45.   glGetIntegerv(GL_MAX_VIEWPORT_DIMS, @CS);
  46.   DWidth :=  Min(CS[0], ClientWidth);
  47.   DHeight := Min(CS[1], ClientHeight);
  48.  
  49.   glViewport(0, 0, DWidth, DHeight);
  50.  
  51.   glMatrixMode(GL_PROJECTION);
  52.   glLoadIdentity();
  53.  
  54.   glOrtho(0, 1, 0, DHeight/DWidth, -1, 1);
  55.  
  56.   glMatrixMode(GL_MODELVIEW);
  57.   glLoadIdentity();
  58.   SetFontSize(CurFontSize);
  59.   if Assigned(OnPaint) then OnPaint(Sender);
  60. end;

Was daran komisch ist, dürfte eigentlich auffallen. Ich brauche 2x SetSizeFont, damit er die größe auch wirklich verändert. Sobald ich eins der beiden Wegnehme, funktionietr es nicht mehr...


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


Wer ist online?

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