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

Aktuelle Zeit: Fr Jul 18, 2025 00:08

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



Ein neues Thema erstellen Auf das Thema antworten  [ 41 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: einfach nur dumm
BeitragVerfasst: So Okt 12, 2003 15:00 
Offline
DGL Member

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Hi

Ich hab jetzt neu mit OpenGL angefangen. Ich hab zwar vorher schon ein Tutorial über DirectX gelesen, OpenGL gefällt mir aber besser. Deswegen hab ich mir die ersten drei Tuts von dieser Seite reingezogen und eigentlich auch verstanden.
Dann hab ich mich hingesetzt und wollte zum test einfach mal unter der VCL OpenGL richtig starten. Das hier ist der Code:

Code:
  1. var
  2.   Form1: TForm1;
  3.   GLContext: HGLRC; //Das Rendering Context
  4.  
  5. implementation
  6.  
  7. {$R *.dfm}
  8.  
  9. procedure Init_OpenGL;
  10. var
  11.    pfd: PixelFormatdescriptor;
  12.    PixelFormat: TGLUint;
  13. begin
  14. //PixelFormat
  15.  
  16.     with pfd do
  17.       begin
  18.         nSize:= SizeOf( PIXELFORMATDESCRIPTOR );
  19.         nVersion:= 1;
  20.         dwFlags:= PFD_DRAW_TO_WINDOW
  21.           or PFD_SUPPORT_OPENGL
  22.           or PFD_DOUBLEBUFFER;
  23.         iPixelType:= PFD_TYPE_RGBA;
  24.         cColorBits:= 16;             //Farbtiefe
  25.         cRedBits:= 0;
  26.         cRedShift:= 0;
  27.         cGreenBits:= 0;
  28.         cBlueBits:= 0;
  29.         cBlueShift:= 0;
  30.         cAlphaBits:= 0;
  31.         cAlphaShift:= 0;
  32.         cAccumBits:= 0;              //Accumulation Buffer
  33.         cAccumRedBits:= 0;
  34.         cAccumGreenBits:= 0;
  35.         cAccumBlueBits:= 0;
  36.         cAccumAlphaBits:= 0;
  37.         cDepthBits:= 16;             //Z-Buffer Tiefe
  38.         cStencilBits:= 0;            //Stencil Buffer
  39.         cAuxBuffers:= 0;
  40.         iLayerType:= PFD_MAIN_PLANE;
  41.         bReserved:= 0;
  42.         dwLayerMask:= 0;
  43.         dwVisibleMask:= 0;
  44.         dwDamageMask:= 0
  45.       end;
  46.     //Pixel Format setzten
  47.     PixelFormat := ChoosePixelFormat(Form1.Canvas.Handle, @pfd);
  48.     if (PixelFormat=0) then
  49.       MessageDlg('Es konnte kein passendes PixelFormat gefunden werden.', mtError, [mbOk], 0);
  50.     if (not Windows.SetPixelFormat(Form1.Canvas.Handle,PixelFormat,@pfd)) then
  51.       MessageDlg('PixelFormat konnte nicht gesetzt werden.', mtError, [mbOk], 0);
  52.  
  53.  
  54. //DeviceContext erstellen:
  55. GLContext := 0;
  56.  
  57. //Rendering Context initialisieren
  58.     GLContext := wglCreateContext(Form1.Canvas.Handle);
  59.     if (GLContext=0) then
  60.     begin
  61.       MessageDlg('Rendering Context kann nicht erstellt werden.', mtError, [mbOk], 0);
  62.       Halt(100)
  63.     end;
  64.  
  65.     if (not wglMakeCurrent(Form1.Canvas.Handle, GLContext)) then
  66.     begin
  67.       MessageDlg('Rendering Context kann nicht aktiviert werden.', mtError, [mbOk], 0);
  68.       Halt(100)
  69.     end;
  70.  
  71.  
  72.  
  73. end;
  74.  
  75. procedure TForm1.FormCreate(Sender: TObject);
  76. begin
  77. Init_OpenGL;
  78.     glClearColor(0.0, 0.0, 0.0, 0.0); //Hintergrundfarbe
  79.     glEnable(GL_DEPTH_TEST); //Tiefenpuffer aktivieren
  80.     glEnable(GL_CULL_FACE); //Backface Culling aktivieren
  81.  
  82.     glShadeModel(GL_SMOOTH)
  83. end;
  84.  


Ich benutze die OpenGL15 Unit dafür, aber wenn ich das Programm starten will kommt immer ein "Format %p ungültig oder nicht kompatibel mit Argument".
Ich hab keine Ahnung woran das liegen kann. Das VCL Beispiel vom ersten Tutorial klappt auch ohne Probleme, wenn ich ein bischen daran änere (Unit anpassen und zwei zeilen die nicht funzen rausnehmen).

Wahrscheinlich hab ich hier einfach nur nen sau dummen Fehler gemacht. Naja ich hoffe ihr könnt mir helfen.


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

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Probiers mal mit
Code:
  1. PixelFormat := ChoosePixelFormat(Form1.Handle, @pfd);

statt mit
Code:
  1. PixelFormat := ChoosePixelFormat(Form1.Canvas.Handle, @pfd);


Das Handle eines Canvas ist im Normalfall nicht gleich dem Handle des Controls und hat schon oft Probleme gemacht.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 12, 2003 16:57 
Offline
DGL Member

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Wenn ich das so mache kommt direkt die Meldung:

Code:
  1. Es konnte kein passendes PixelFormat gefunden werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 12, 2003 17:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Dann musst du halt ein Pixelformat anfordern das von deiner Grafikkarte in deiner aktuellen Konfiguration unterstützt wird.Du forderst ein Format mit 16-Bit Frambuffer und 16-Bit Depthbuffer an,was dir deine Grafikkarte nicht anbietet.

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


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

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Zitat:
Du forderst ein Format mit 16-Bit Frambuffer und 16-Bit Depthbuffer an,was dir deine Grafikkarte nicht anbietet.


Ähm ich hab ne Geforce 2. Da wird das ja wohl noch möglich sein :roll: .
Außerdem sind die PixelFormat einstellungen in dem Beispiel zu Tutorial 1 genauso und da klappt es auch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 12, 2003 17:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Dann lass dir mal nen DC von der Form geben :
Code:
  1. DC := GetDC(Form1.Handle);

Und übergib den mal anstatt Form1.Handle.

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


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

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Klappt leider immenoch nicht.

Ich sollte vielleicht erwähnen das der Fehler nicht auftritt wenn ich die Zeilen
Code:
  1.     glClearColor(0.0, 0.0, 0.0, 0.0); //Hintergrundfarbe
  2.     glEnable(GL_DEPTH_TEST); //Tiefenpuffer aktivieren
  3.     glEnable(GL_CULL_FACE); //Backface Culling aktivieren
  4.  
  5.     glShadeModel(GL_SMOOTH)


weglasse. Nur dann ist das hal ein ganze normales leeres Fenster.


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

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Erstell mal dein OpenGl zeugs nicht im OnCreate sondern im OnShow Ereignis...


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

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Immernoch nicht. Auch nicht wenn ich das ganze auf nen Button lege.

Verdammt es kann doch nicht sein das ich schon an so nem billigscheiß scheitere :oops: :x


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 13, 2003 15:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenn du unsere OpenGL-Unit nutzt (dglOpenGL.pas) musst du vor dem Erstellen des Renderkontextes erstmal die Funktion InitOpenGL aufrufen damit alle Funktionspointer von OpenGL zugewiesen werden.Wenn das nicht gemacht wird,zeigen die Funktionszeiger nämlich auf nil und sind nicht nutzbar.

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


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

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Ich benutz die OpenGL15.pas Unit die ich auf dieser Seite im Downloadbereich geladen habe.

Und die Function InitOpenGL kennt der auch nicht


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

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das ist eine alte Version unseres Headers,die allerings auch einer Initialisierung bedarf.Bitte benutz stattdessen den neuen Header aus diesem Thread.

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


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

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
THX. Jetzt klappt es. Allerdings gibt es eine Sache die mich wundert:

Wenn ich glClearColor(0.0, 0.0, 0.0, 0.0) schreibe, und somit den Bildschirm ja ganz schwarz färben will, wird das trotzdem so grünfarbend.

Und warum kann ein das Beispiel aus dem Tut kompilieren, obwohl das auch nicht diese Init Function aufruft?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 13, 2003 17:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
SamStone hat geschrieben:
Wenn ich glClearColor(0.0, 0.0, 0.0, 0.0) schreibe, und somit den Bildschirm ja ganz schwarz färben will, wird das trotzdem so grünfarbend.

glClearColor ist nicht dazu da um den Framebuffer zu löschen,sondern setzt nur die Farbe mit der das getan wird.Gelöscht wird dieser mit glClear und dem GL_COLOR_BUFFER_BIT.

SamStone hat geschrieben:
Und warum kann ein das Beispiel aus dem Tut kompilieren, obwohl das auch nicht diese Init Function aufruft?


Weil im Tut die OpenGL12.pas genutzt wird,bei der diese Initialisierungen automatisch aufgerufen werden.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 13, 2003 17:48 
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

EDIT: Mist. Doppelpost. Sorry


Zuletzt geändert von SamStone am Mo Okt 13, 2003 17:50, insgesamt 1-mal geändert.

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 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 17 Queries | GZIP : On ]