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

Aktuelle Zeit: So Mai 19, 2024 11:59

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Texturen in OpenGL12
BeitragVerfasst: Fr Okt 11, 2002 16:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 08, 2002 16:44
Beiträge: 10
Grüße,

Ich benutze OpenGL12 von Mike Lischke und die glBMP.
Mit dem standard openGL von Delphi 6 hat es auch funktioniert, nur jetzt mit openGL12 zeichnet er die Textur nicht mehr, sondern nur ein weißes Quadrat. ich hab shcon alles mögliche versucht, nur bin ich zu keinem Ergbnis gekommen. :(

Hier mal der Code:
Code:
  1. ...
  2.  
  3. ProCeDure TPanelGL.DrawScene;
  4.  
  5. BEGIN
  6.  
  7.         rotate:=rotate+0.1*rendertime;
  8.  
  9.         glRotatef(rotate,0,0,1);
  10.  
  11.         textures[0].Bind();
  12.  
  13.         glBegin(GL_QUADS);
  14.  
  15.            glTexCoord2f(0,0); glVertex3f(-1,-1,0);//pkt links unten
  16.  
  17.            glTexCoord2f(0,1); glVertex3f(-1,1,0);//pkt links oben
  18.  
  19.            glTexCoord2f(1,1); glVertex3f(1,1,0);//pkt rechts oben
  20.  
  21.            glTexCoord2f(1,0); glVertex3f(1,-1,0);//pkt rechts unten
  22.  
  23.         glEnd;
  24.  
  25.  
  26.  
  27. END;Procedure TPanelGL.GetTextures;
  28.  
  29. BEGin
  30.  
  31. ActivateRenderingContext(DC, RC);
  32.  
  33.    textures[0]:=TGLBMP.Create();
  34.  
  35.    textures[0].LoadImage('verlauf.bmp');
  36.  
  37.    textures[0].GenTexture();
  38.  
  39. DeActivateRenderingContext;
  40.  
  41. END;
  42.  
  43. procedure TPanelGL.FormCreate(Sender: TObject);
  44.  
  45. var
  46.  
  47.  DummyPal : HPalette;
  48.  
  49. begin
  50.  
  51. ...
  52.  
  53.  
  54.  
  55. DC := GetDC(PlayGround.Handle);
  56.  
  57. RC := CreateRenderingContext(DC, [opDoubleBuffered], 16, 0, 0, 0, 0,DummyPal);
  58.  
  59. ActivateRenderingContext(DC, RC);
  60.  
  61. glClearColor(0,0,0,0);
  62.  
  63. glEnable(GL_TEXTURE_2D);
  64.  
  65. glEnable(GL_DEPTH_TEST);
  66.  
  67. glEnable(GL_LIGHTING);
  68.  
  69. glEnable(GL_NORMALIZE);
  70.  
  71. glEnable(GL_COLOR_MATERIAL);
  72.  
  73. glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
  74.  
  75. DeActivateRenderingContext;
  76.  
  77. GetTextures;
  78.  
  79.  
  80.  
  81. end;
  82.  
  83. procedure TPanelGL.FormDestroy(Sender: TObject);
  84.  
  85. begin
  86.  
  87. DestroyRenderingContext(RC);
  88.  
  89. end;
  90.  
  91.  
  92.  
  93. procedure TPanelGL.ApplicationEvents1Idle(Sender: TObject;
  94.  
  95.   var Done: Boolean);
  96.  
  97.  
  98.  
  99. begin
  100.  
  101. ActivateRenderingContext(DC, RC);
  102.  
  103. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  104.  
  105. glViewport(0, 0, PlayGround.ClientWidth, PlayGround.ClientHeight);
  106.  
  107. glMatrixMode(GL_PROJECTION);
  108.  
  109. glLoadIdentity;
  110.  
  111. gluPerspective(45, PlayGround.ClientWidth/PlayGround.ClientHeight, 0.1, 1024);
  112.  
  113. glMatrixMode(GL_MODELVIEW);
  114.  
  115. glLoadIdentity;
  116.  
  117.  
  118.  
  119. glTranslatef(0,0,-10);
  120.  
  121.  
  122.  
  123.  
  124.  
  125. DrawScene;
  126.  
  127.  
  128.  
  129. Rendertime:=GetTickCount()-Lasttime;
  130.  
  131. Lasttime := GetTickCount();
  132.  
  133. inc(frames);
  134.  
  135. SwapBuffers(DC);
  136.  
  137. DeActivateRenderingContext;
  138.  
  139. Done := False;
  140.  
  141. end;
  142.  
  143. ...

Hoffe jemand findet den Fehler :)
das Ganze findet sich auch hier: <a href='http://files.scriptz4clanz.de/PanelGL.zip' target='_blank'>http://files.scriptz4clanz.de/PanelGL.zip</a>
Veiovis


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 11, 2002 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
So...ich hab mich mal um dein Prog gekümmert, dabei ist mir folgende Prozedur direkt aufgefallen :
Code:
  1.  
  2.  
  3. procedure TPanelGL.FormResize(Sender: TObject);
  4.  
  5. VAR DummyPal : HPalette;
  6.  
  7. begin
  8.  
  9. DestroyRenderingContext(RC);
  10.  
  11. PlayGround.Top:=0;
  12.  
  13. PlayGround.left:=0;
  14.  
  15. PlayGround.Height:=PanelGL.ClientHeight;
  16.  
  17. PayGround.width:=PanelGL.Clientwidth;}
  18.  
  19. DC := GetDC(PlayGround.Handle);
  20.  
  21. RC := CreateRenderingContext(DC, [opDoubleBuffered], 16, 0, 0, 0, 0,DummyPal);
  22.  
  23. ActivateRenderingContext(DC, RC);
  24.  
  25. glClearColor(0,0,0,0);
  26.  
  27. DeActivateRenderingContext;
  28.  
  29. end;
  30.  
  31.  


Hier machst du einen großen Fehler!Am Programmanfang erstellst du einen OpenGL-Kontext, und lädst Texturen.
Diese Texturen gehören dann auch diesem Kontext (und z.B. würden dies auch darin erstellte DisplayListen).
In obiger Resize-Prozedur löschst du aber den alten Kontext und erstellst einen neuen...dadurch gehen alle zu dem alten Kontext gehörenden Texturen verloren!
Deshalb also nur ein weisses Quad.

Hier die Lösung :
Code:
  1.  
  2.  
  3. procedure TPanelGL.FormResize(Sender: TObject);
  4.  
  5. begin
  6.  
  7. if (HandleAllocated) and (DC > 0) and (RC > 0) then
  8.  
  9.  begin
  10.  
  11.  ActivateRenderingContext(DC, RC);
  12.  
  13.  glViewport(0, 0, PlayGround.ClientWidth, PlayGround.ClientHeight);
  14.  
  15.  glMatrixMode(GL_PROJECTION);
  16.  
  17.  glLoadIdentity;
  18.  
  19.  gluPerspective(45, PlayGround.ClientWidth/PlayGround.ClientHeight, 0.1, 100);
  20.  
  21.  DeactivateRenderingContext;
  22.  
  23. end;
  24.  
  25.  


Achtung!Damit das auch funzt, muss sich das Panel der Form anpassen!Dazu setze einfach die Eigenschaft "Align" des Panels auf "alClient".

Die neue Prozedur reagiert auf den Resize erst, wenn der Renderingcontext erstellt wurde und gültig ist, dann wird er der Größe des Panels angepasst!

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 12, 2002 13:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 08, 2002 16:44
Beiträge: 10
dake für die Mühe, es funkioniert wunderbar :)

das war natürlich die ptozedur, wo ich am wenigsten rumprobierte, da ich dachte die wird eh erst beim ersten 'resizen' aufgerufen :)

Gruß
Veiovis


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 12, 2002 13:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
dake für die Mühe, es funkioniert wunderbar :)

das war natürlich die ptozedur, wo ich am wenigsten rumprobierte, da ich dachte die wird eh erst beim ersten 'resizen' aufgerufen :)

Gruß
Veiovis


Jupp...die wird natürlich erst beim Resizen aufgerufen, aber direkt nach dem Start des Programmes findet ein Resize statt, so dass dann auch direkt in diese Prozedur gesprungen wird!

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 12, 2002 13:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 08, 2002 16:44
Beiträge: 10
wieder etwas dazu gelernt *g*


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