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

Aktuelle Zeit: Fr Jul 18, 2025 00:19

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



Ein neues Thema erstellen Auf das Thema antworten  [ 41 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 13, 2003 17:49 
Offline
DGL Member

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Zitat:
Weil im Tut die OpenGL12.pas genutzt wird,bei der diese Initialisierungen automatisch aufgerufen werden.

Ich hab aber unter uses die Unit verändert.

Zitat:
Gelöscht wird dieser mit glClear und dem GL_COLOR_BUFFER_BIT.

Ups :oops:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 19, 2003 17:49 
Offline
DGL Member

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Sorry das ich hier schon wieder mit so ner dummen Anfängerfrage störe. Also ich bin nachdem das mit dem Bildschirm löschen geklappt hat einfach mal davon ausgegangen das es auch kein Problem sein wird ein Dreieck auf dem Bildschirm anzuzeigen. Als ich das aber vorhin ausprobiert habe, zeigt er trotzdem einfach nur einen schwarzen Bildschirm an. Hier ein Stück des Codes:

Code:
  1.  
  2. procedure TForm1.FormShow(Sender: TObject);
  3. begin
  4. InitOpenGL;
  5. Init_OpenGL;
  6.  
  7. glClearColor(0.0, 0.0, 0.0, 0.0); //Hintergrundfarbe
  8. glEnable(GL_DEPTH_TEST); //Tiefenpuffer aktivieren
  9. glEnable(GL_CULL_FACE); //Backface Culling aktivieren
  10.  
  11. glShadeModel(GL_SMOOTH);
  12.  
  13. Application.OnIdle := On_Idle;
  14. end;
  15.  
  16. procedure TForm1.On_Idle(Sender: TObject;
  17.   var Done: Boolean);
  18. begin
  19.     done := false;
  20.     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Löschen
  21.  
  22.     glMatrixMode(GL_MODELVIEW);    
  23.  
  24.     glLoadIdentity;
  25.     glTranslatef(0, 0, -6);
  26.  
  27.     glBegin(GL_TRIANGLES);
  28.      glColor3f(1,0,0);
  29.      glVertex3f(-1.0, -1.0, 0.0);
  30.      glVertex3f(0.0, 1.0, 0.0);
  31.      glVertex3f(1.0, -1.0, 0.0);
  32.     glEnd;
  33.  
  34.     SwapBuffers(Form1.Canvas.Handle);
  35. end;


Ich versteh nicht was ich immer falsch mache. :cry:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 19, 2003 18:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Code:
  1. DC := GetDC(Form1.Handle);
  2. ...
  3. SwapBuffers(DC)


Ich glaube bereits erwähnt zu haben,das die Sache mit Form1.Canvas.Handle nicht funzt und davon abgesehen will SwapBuffers einen DC.Ein DeviceContext ist aber was anderes als das Handle eines Controls.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 19, 2003 18:26 
Offline
DGL Member

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Sorry ich war verpeilt. Hab das jetzt alles geändert. Klappt aber leider immernoch nicht.

Edit: Kann es sein das ich irgendetwas an der Projections-Matrix einstellen muss?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 19, 2003 18:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Lass die Zeile mal weg :
Code:
  1. glEnable(GL_CULL_FACE);

Aufgrund deiner Verrexreiheinfolge (Clockwise) wird dein Dreieck nämlich vom Backfaceculling entfernt.Das liegt daran,weil glFrontFace standardmäßig auf GL_CCW (Counterclockwise) steht und dein Dreieck (CW) also ein Backface darstellt.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 19, 2003 18:43 
Offline
DGL Member

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Hab ich schon ausprobiert. Klappt auch nicht


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 19, 2003 18:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Dann machst du (noch was) grundlegend falsch.Probier also mal die Projektionsmatrix zu setzen (glViewport, gluPerspective) und stell sicher das dein OnIdle-Event aufgerufen wird

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 19, 2003 19:05 
Offline
DGL Member

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Klappt immernoch nicht. Hier nochmal der komplette Code:

Code:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, dglOpenGL, AppEvnts;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     procedure FormShow(Sender: TObject);
  12. procedure On_Idle(Sender: TObject; var Done: Boolean);
  13.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  14.   private
  15.     { Private-Deklarationen }
  16.   public
  17.     { Public-Deklarationen }
  18.   end;
  19.  
  20. var
  21.   Form1: TForm1;
  22.   GLContext: HGLRC; //Das Rendering Context
  23.   DeviceContext: HDC;
  24.   Model: MS3DModel;
  25.  
  26. const
  27.   //Entfernung der Clipping planes
  28.   FarClipping   = 1000.0;
  29.   NearClipping  = 1.0;
  30.  
  31. implementation
  32.  
  33. {$R *.dfm}
  34.  
  35. procedure Init_OpenGL;
  36. var
  37.    pfd: PixelFormatdescriptor;
  38.    PixelFormat: TGLUint;
  39. begin
  40. //PixelFormat
  41.  
  42.     with pfd do
  43.       begin
  44.         nSize:= SizeOf( PIXELFORMATDESCRIPTOR );
  45.         nVersion:= 1;
  46.         dwFlags:= PFD_DRAW_TO_WINDOW
  47.           or PFD_SUPPORT_OPENGL
  48.           or PFD_DOUBLEBUFFER;
  49.         iPixelType:= PFD_TYPE_RGBA;
  50.         cColorBits:= 16;             //Farbtiefe
  51.         cRedBits:= 0;
  52.         cRedShift:= 0;
  53.         cGreenBits:= 0;
  54.         cBlueBits:= 0;
  55.         cBlueShift:= 0;
  56.         cAlphaBits:= 0;
  57.         cAlphaShift:= 0;
  58.         cAccumBits:= 0;              //Accumulation Buffer
  59.         cAccumRedBits:= 0;
  60.         cAccumGreenBits:= 0;
  61.         cAccumBlueBits:= 0;
  62.         cAccumAlphaBits:= 0;
  63.         cDepthBits:= 16;             //Z-Buffer Tiefe
  64.         cStencilBits:= 0;            //Stencil Buffer
  65.         cAuxBuffers:= 0;
  66.         iLayerType:= PFD_MAIN_PLANE;
  67.         bReserved:= 0;
  68.         dwLayerMask:= 0;
  69.         dwVisibleMask:= 0;
  70.         dwDamageMask:= 0
  71.       end;
  72.  
  73.     //Das Device Context bekommen:
  74.     DeviceContext := GetDC(Form1.Handle);
  75.  
  76.     //Pixel Format setzten
  77.     PixelFormat := ChoosePixelFormat(DeviceContext, @pfd);
  78.     if (PixelFormat=0) then
  79.       MessageDlg('Es konnte kein passendes PixelFormat gefunden werden.', mtError, [mbOk], 0);
  80.     if (not Windows.SetPixelFormat(DeviceContext,PixelFormat,@pfd)) then
  81.       MessageDlg('PixelFormat konnte nicht gesetzt werden.', mtError, [mbOk], 0);
  82.  
  83.  
  84.  //Rendering Context initialisieren
  85.     GLContext := wglCreateContext(DeviceContext);
  86.     if (GLContext=0) then
  87.     begin
  88.       MessageDlg('Rendering Context kann nicht erstellt werden.', mtError, [mbOk], 0);
  89.       Halt(100)
  90.     end;
  91.  
  92.     if (not wglMakeCurrent(DeviceContext, GLContext)) then
  93.     begin
  94.       MessageDlg('Rendering Context kann nicht aktiviert werden.', mtError, [mbOk], 0);
  95.       Halt(100)
  96.     end;
  97.  
  98. end;
  99.  
  100. procedure TForm1.On_Idle(Sender: TObject;
  101.   var Done: Boolean);
  102. begin
  103.     done := false;
  104.     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Löschen
  105.  
  106.     glMatrixMode(GL_MODELVIEW);
  107.  
  108.     glLoadIdentity;
  109.     glTranslatef(0, 0, -6);
  110.  
  111.     glBegin(GL_TRIANGLES);
  112.      glColor3f(1,0,0);
  113.      glVertex3f(-1.0, -1.0, 0.0);
  114.      glVertex3f(0.0, 1.0, 0.0);
  115.      glVertex3f(1.0, -1.0, 0.0);
  116.     glEnd;
  117.  
  118.     SwapBuffers(DeviceContext);
  119. end;
  120.  
  121. procedure TForm1.FormShow(Sender: TObject);
  122. begin
  123. InitOpenGL;
  124. Init_OpenGL;
  125.  
  126. glClearColor(0.0, 0.0, 0.0, 0.0); //Hintergrundfarbe
  127. glEnable(GL_DEPTH_TEST); //Tiefenpuffer aktivieren
  128. glEnable(GL_CULL_FACE); //Backface Culling aktivieren
  129.  
  130. glShadeModel(GL_SMOOTH);
  131.  
  132. glViewport(0, 0, ClientWidth, ClientHeight);
  133. //Projektionsmatrix resetten
  134. glMatrixMode(GL_PROJECTION);
  135. glLoadIdentity();
  136. //Perspektivische Darstellung
  137. gluPerspective(60.0,ClientWidth/ClientHeight,NearClipping,FarClipping);// Calculate The Aspect Ratio Of The Window
  138. glMatrixMode(GL_MODELVIEW);
  139.  
  140. Application.OnIdle := On_Idle;
  141. end;
  142.  
  143. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  144. begin
  145. //Rendering Context freigeben:
  146.   if GLContext<>0 then
  147.     begin
  148.       if (not wglMakeCurrent(Canvas.Handle,0)) then
  149.         MessageDlg('Rendering Context konnte nicht abgewählt werden.', mtError, [mbOk], 0);
  150.       if (not wglDeleteContext(GLContext)) then
  151.         MessageDlg('Rendering Context konnte nicht freigegeben werden.', mtError, [mbOk], 0)
  152.     end;
  153.   GLContext:=0    
  154. end;
  155.  
  156. end.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 20, 2003 09:55 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Evtl. solltest du SoS Beiträge doch etwas genauer durchlesen - wenn du nämlich dein OnIdle Event so aufbaust:

Code:
  1.     done := false;
  2.     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Löschen
  3.    
  4.     // Rückseitenentfernung ausschalten
  5.     glDisable(GL_CULL_FACE);
  6.  
  7.     glMatrixMode(GL_MODELVIEW);
  8.  
  9.     glLoadIdentity;
  10.     glTranslatef(0, 0, -6);
  11.  
  12.     glBegin(GL_TRIANGLES);
  13.      glColor3f(1,0,0);
  14.      glVertex3f(-1.0, -1.0, 0.0);
  15.      glVertex3f(0.0, 1.0, 0.0);
  16.      glVertex3f(1.0, -1.0, 0.0);
  17.     glEnd;
  18.  
  19.     SwapBuffers(DeviceContext);
  20.  


Erscheint dein rotes Dreieck wie von Zauberhand.

Einfacher zum Testen (und besser lesbar) wäre übrigens, wenn du einen Link auf dein Projekt geben würdest, anstatt das Ganze als Text zu posten.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 20, 2003 13:39 
Offline
DGL Member

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Komisch. Also den Code den ich da oben gepostet habe war ne Version wo ich das glDisable(GL_CULL_FACE); noch nicht drinhatte. Das hatte ich zwischendurch jedoch schon drin und es hat nicht geklappt. Dann hab ich das jetzt gerade nochmal probiert und nun geht's. :lol:
Hät ich vielleicht einfach mal neu hochfahren müssen oder so.

Jedenfalls vielen Dank das ihr euch die Mühe gemacht habt mir zu helfen.

Edit: Ne ich weiß jetzt worans lag. Ich hab erstmal das Cull_Face Disabled und das hatte dann nicht geklappt. Deswegen hab ich vergessen das so zu speichern und das war dann wieder draußen. Dann hab ich die Projectionsmatrix gesetzt, aber da das Culling wieder aktiviert war konnte der wieder nicht anzeigen. Hätte ich es wieder eingestellt hätte es geklappt :oops:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 22, 2003 12:02 
Offline
DGL Member

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Das Fragen nimmt kein Ende. Das ist jetzt die Krönung:

Ich konnte, nachdem ihr mir hier geholfen hat, also Dreiecke rendern. Also hab ich mich hingesetzt und einen Milkshape loader geschrieben, der die Models auch problemlos rendern konnte, aber OHNE Texturen, also nur bunte dreiecke. Das programm hat auch ohne probleme geklappt, also ich konnte das Programm mehrere Male hintereinander ausführen ohne das ein Fehler kam. Dann hab ich mir ne Unit geschrieben die sich um die Texturen kümmern sollte, die also im RGB Format in den Arbeitsspeicher schreibt und einen Pointer darauf an die betreffene OpenGL Procedure übergibt. Als ich das fertig hatte, konnte das Programm zwar laden, hat jedoch keine texturen angezeigt und konnte kein zweites mal mehr gestartet werden. Da kam dann beim ersten mal so ne komische Fehlermeldung und danach ging das Programm direkt beim Start sofort wieder aus. Dachte ich mir: "Kein Problem, lad ich doch einfach die alte Datei die noch ohne Texturen war" Die konnte seit dem aber auch nurnoch einmal geladen werden und danach nichtmehr (bis man neu hochgefahren hat). Da war ich erstmasl wieder verdammt wütend :evil: und hab auch das Milkshape rendern rausgenommen, und jede form von rendern, also dass nurnoch OpenGL initialisiert und beim klick auf das X wieder entfernt wird. Aber auch das ging aufeinmal nurnoch einmal bis zum neuhochfahren.
Der Fehler passiert übrigens genau in der Procedure in der das Pixelformat gesetzt wird.

Was hab ich nun schon wieder falsch gemacht. Eigentlich ist sowas doch garnicht möglich, es sei denn ich hab die Grafikkarte geschrottet, was ich nicht glaube :lol:

Edit: Die Fehlermeldung lautet so:
Zitat:
Ddhelp hat in <Unbekannt> einen Fehler verursacht.
Ddhelp wird geschlossen

Falls weiterhin Probleme auftreten, starten Sie den Computer neu.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 22, 2003 13:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Sicher das der Fehler von deiner Anwendung kommt?ddhelp.exe ist nämlich ein Hilfsprogramm von DirectDraw,weshalb ich mir kaum vorstellen kann wie ein OpenGL-Programm in ddhelp einen Fehler auslösen kann.Einzig ein schlechter Grafikkartentreiber,der OpenGL-Calls auf DirectDraw wrappt könnte sowas verursachen,sowas wird aber seit Jahren bei keiner Grafikkarte mehr gemacht.
Benutzt du auch wirklich keine Fremdunits (irgend nen DirectX-Teil oder so),die den Fehler verursachen?Ansonsten poste mal dein Pixelformat.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 22, 2003 14:18 
Offline
DGL Member

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Also ich benutz auf garkeinen fall irgendwelche dx units darin. Meine Grafikkarte ist ne Geforce 2 MX und dafür hab ich auch ziemlich aktuelle Treiber drauf.

Mein Pixelformat teil steht jedenfalls ein bischen höher schon, an der stelle wo ich den ganzen code gepostet habe.

Edit: Was ist denn jetzt los. Auf einmal klappt es wieder. Ich hab den PC vorhin mindestens 20 mal neu hoch und runter gefahren und nichts ging. Dann geb ich es auf und probier es gerade eben nochmal und es geht wieder :?: . Irgendwas stimmt mit meinem PC nicht.
Jedenfalls danke nochmal für die Hilfe.

Edit2: Jetzt weiß ich wann das immer klappt und wann nicht: Wenn ich vorher schon ein OpenGL spiel, wie zum Beispiel Half Life anhatte, dann klappt es. Hatte ich sowas aber noch nicht an dann kommt der Fehler bei meinem Programm und auch andere OpenGL sachen bleiben danach aus.
Ich hab mir jetzt gerade auch schon die neusten Detonator Treiber gesaugt, was aber auch nicht nützt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 22, 2003 16:08 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Also diesen DDhelp-Bug kann ich in diesem Falle bestätigen... bei mir
(P3 500; Nvidia TNT2; Neuste Treiber) kommt der auch manchmal vor OGL-Anwendungen ... leider relativ unkalkulierbar... mal kommts, mal nicht.... (nicht nur bei meinem Progies... bei fast allen OGL-Programmen durfte ich das bislang schon erleben....)

Irgendwie merkwürdig... weiß niemand, woran das liegen kann?
(Und: was hat OpenGL mit einer Direct-Draw-file zu tun?)

_________________
Es sind immer die guten,
welche zu früh von uns gehen müssen...

Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net
Neu! Ein großer Teil der Demos nach Kylix übersetzt!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 22, 2003 16:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das klingt alles recht eigenartig,und auf die Schnelle hab ich nur folgenden Artikel von ATI gefunden,in dem u.a. entweder ein nicht korrekter Wechsel des Grafikkartentreibers (also neuer Treiber ohne Deinstallation des alten) dran schuld sein soll,oder eine für den aktuellen Grafikkartentreiber unpassende DirectX-Version.
Was das mit OpenGL zu tun hat weis ich nicht,kann allerdings sein das der Grafikkartentreiber immer DirectX zum Umschalten der Auflösung nutzt (NVidia bekleckern sich momentan ja eh nicht mir Ruhm).Also am besten mal aktuellen Grafikkartentreiber deinstallieren,neueste DX-Version installieren und dann neusten Treiber (der für DX9 ausgelegt ist).

_________________
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  [ 41 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 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]