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

Aktuelle Zeit: Sa Jul 19, 2025 21:01

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Okt 31, 2009 19:32 
Offline
DGL Member

Registriert: Fr Mai 29, 2009 19:44
Beiträge: 12
Wohnort: Saarland
Hallo,
ich versuche schon seit ein paar Stunden einen OpenGl3.2 GC zu erstellen, aber irgendwie kriege ich es nicht ganz gebacken ^^
Ich habe mir schon das Tutorial zu OpenGL 3 durchgelesen, aber ich kenne mich in C nicht aus.
Auch google liefert keine nützlichen Tipps/Codes. Würde das ganze halt gern in Delphi machen, aber zur Zeit beisse ich mir die Zähne an der erstellung des GCs aus :D
Wenn jemand schon einen CG für OpenGL 3.2 erstellt hat, köne er/sie dann den Code hier vill. reinposten, oder mir erklären wie ich einen erstellen kann?


Danke :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Nov 05, 2009 19:41 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

ich habe den Code auf Delphi umgeschrieben, kann jedoch nicht garantieren, dass dieser richtig ist, da ich keine OpenGL 3.0-fähige Grafikkarte habe.
Code:
  1. type
  2.   TWGLCreateContextAttribsARB = function(DC: HDC; hShareContext: HGLRC; const attriblist: array of Integer): HGLRC; stdcall;
  3. const
  4.     WGL_CONTEXT_MAJOR_VERSION_ARB = $2091;
  5.     WGL_CONTEXT_MINOR_VERSION_ARB=  $2092;
  6.     WGL_CONTEXT_LAYER_PLANE_ARB   = $2093;
  7.     WGL_CONTEXT_FLAGS_ARB           = $2094;
  8.     WGL_CONTEXT_PROFILE_MASK_ARB  = $9126;
  9.   WGL_CONTEXT_DEBUG_BIT_ARB     =   $0001;
  10.     WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB  =   $0002;
  11.  
  12. procedure CreateOpenGL3Context(hwindow: hwnd);
  13. var
  14.   DeviceContext: HDC;
  15.   Tempcontext, Context: HGLRC;
  16.   attribs: array[0..6] of Integer;
  17.   wglCreateContextAttribsARB: TWGLCreateContextAttribsARB;
  18. begin
  19.   deviceContext := GetDC(hwindow);
  20.   tempcontext := CreateRenderingContext(deviceContext, [opDoubleBuffered],
  21.                                32, 24, 0, 0, 0, 0);
  22.   if tempcontext = 0 then
  23.   begin
  24.     ShowMessage('Error: Could not create an OpenGL rendering context');
  25.     exit;
  26.   end;
  27.   ActivateRenderingContext(deviceContext, tempcontext);
  28.   wglCreateContextAttribsARB := nil;
  29.   wglCreateContextAttribsARB := wglGetProcAddress('wglCreateContextAttribsARB');
  30.   if not Assigned(wglCreateContextAttribsARB) then
  31.   begin
  32.     wglDeleteContext(TempContext);
  33.     ShowMessage('Error: There is no OpenGL3 context support.');
  34.     exit;
  35.   end;
  36.   attribs[0] := WGL_CONTEXT_MAJOR_VERSION_ARB;
  37.   attribs[1] := 3;
  38.   attribs[2] := WGL_CONTEXT_MINOR_VERSION_ARB;
  39.   attribs[3] := 1;  //Für OpenGL 3.2 muss man das hier (wahrscheinlich) auf 2 setzen
  40.   attribs[4] := WGL_CONTEXT_FLAGS_ARB;
  41.   attribs[5] := WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
  42.   attribs[6] := 0;
  43.   Context := wglCreateContextAttribsARB(DeviceContext,0, attribs);//versuche ein OpenGL3.1 fähigen Context zu erstellen
  44.   if context = 0 then
  45.   begin
  46.     //Entweder hat der Treiber noch keinen OpenGL3.1 support oder die Grafikkarte beherrscht kein OpenGL3.1.
  47.     ShowMessage('Error: Couldnt create OpenGL3.1 context. Try now OpenGL3.0 context');
  48.     attribs[3] := 0;//Setze minor version auf 0 um ein OpenGL3.0 context zu erstellen.
  49.     Context := wglCreateContextAttribsARB(DeviceContext,0, attribs);
  50.     if context = 0 then
  51.     begin
  52.       //Die -->Grafikkarte<-- beherrscht kein OpenGL3.
  53.       wglDeleteContext(TempContext);//aufräumen und beenden
  54.       ShowMessage('Error: Couldnt create OpenGL3 context.');
  55.       exit;
  56.     end;
  57.   end;
  58.   wglMakeCurrent(DeviceContext,Context);//wechsel auf den OpenGL3.x context
  59.   wglDeleteContext(TempContext);//Zerstöre den temporären Context, denn er wird nicht länger benötigt.
  60. end;
Ich verwende den DGL Header, also vorher InitOpenGL aufrufen :)

Gruß Joni.


Zuletzt geändert von Joni am Do Dez 03, 2009 15:57, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Nov 06, 2009 16:49 
Offline
DGL Member

Registriert: Fr Mai 29, 2009 19:44
Beiträge: 12
Wohnort: Saarland
Vielen Dank :)
Ich denke von deinem Code aus komme ich weiter :)
Ich vergleiche einfach mal C++ und Delphi Code und dann klappt das schon :)
Danke nochmal :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Dez 01, 2009 19:11 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

das ist mir jetzt etwas peinlich, aber ich habe einen neuen Rechner mit OpenGL 3.2 fähiger Grafikkarte und stehe jetzt vor dem selben Problem -.- mit meinem Code klappts auf jeden Fall bei mir nicht. Ein Treiberproblem schließe ich aus, da http://www.dhpoware.com/demos/gl3HelloWorld.html bei mir funktioniert. Falls du - oder jemand anderes - das mittlerweile in Delphi geschafft hat, wäre es sehr nett, wenn das hier jemand posten würde :)

Gruß Joni.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Dez 02, 2009 09:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich habe nur 3.1er Hardware. Entsprechend kann ich nicht sagen ob das mit 3.2 funktionieren würde oder nicht. Für die dglOpenGL hatte ich eine Testanwendung geschrieben wo ich den 3.0 Kontext getestet hatte. Ich habe das gerade mal auf ein Delphi Formular übertragen.

Ob der Code so richtig schön ist lasse ich mal dahin gestellt. Auch weiß ich nicht ob er richtig sicher ist. Also ich weiß nicht was was passiert, wenn GL 3.0 nicht unterstützt wird. Bzw muss der natürlich auch an die jeweiligen Gegebenheiten angepasst werden.

Code:
  1. procedure TMainForm.FormShow(Sender: TObject);
  2. var
  3.   // gl2
  4.   PixelFormatDescriptor: TPixelFormatDescriptor;
  5.   PixelFormat: Integer;
  6.   gl2Context: HGLRC;
  7.  
  8.   // gl3
  9.   Attribs: array of GLint;
  10. begin
  11.   // init OpenGL
  12.   if not InitOpenGL then
  13.     raise Exception.Create('OpenGL seems to be unsupported.');
  14.  
  15.   // create dc
  16.   fDC := GetDC(Handle);
  17.  
  18.   // initiale pixelformat structure
  19.   FillChar(PixelFormatDescriptor, SizeOf(PixelFormatDescriptor), 0);
  20.   with PixelFormatDescriptor do begin
  21.     nSize := SizeOf(PixelFormatDescriptor);
  22.     nVersion := 1;
  23.     dwFlags := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER;
  24.     iPixelType := PFD_TYPE_RGBA;
  25.     cColorBits := 32;
  26.     cDepthBits := 24;
  27.     iLayerType := PFD_MAIN_PLANE
  28.   end;
  29.  
  30.   // choose pixelformat
  31.   PixelFormat := ChoosePixelFormat(fDC, @PixelFormatDescriptor);
  32.   if PixelFormat = 0 then
  33.     RaiseLastOSError;
  34.  
  35.   // set pixelformat
  36.   if not SetPixelFormat(fDC, PixelFormat, @PixelFormatDescriptor) then
  37.     RaiseLastOSError;
  38.  
  39.   // create gl 2.0 context
  40.   gl2Context := wglCreateContext(fDC);
  41.  
  42.   // activate gl 2.0 context
  43.   wglMakeCurrent(fDC, gl2Context);
  44.  
  45.   // check for extension and load wglCreateContextAttribsARB inside of dglOpenGL
  46.   WGL_ARB_create_context := dglCheckExtension('WGL_ARB_create_context');
  47.   wglCreateContextAttribsARB := dglGetProcAddress('wglCreateContextAttribsARB');
  48.  
  49.   if not (WGL_ARB_create_context and Assigned(@wglCreateContextAttribsARB)) then
  50.     raise Exception.Create('OpenGL 3.0 seems to be unsupported.');
  51.  
  52.   // setup attribs for gl 3.0
  53.   SetLength(Attribs, 5);
  54.   Attribs[0] := WGL_CONTEXT_MAJOR_VERSION_ARB;
  55.   Attribs[1] := 3;
  56.   Attribs[2] := WGL_CONTEXT_MINOR_VERSION_ARB;
  57.   Attribs[3] := 2;
  58.   Attribs[4] := 0;
  59.  
  60.   // try create 3.2 context
  61.   fRC := wglCreateContextAttribsARB(fDC, 0, @Attribs[0]);
  62.  
  63.   // fallback to 3.1
  64.   if fRC = 0 then begin
  65.     Attribs[3] := 1;
  66.     fRC := wglCreateContextAttribsARB(fDC, 0, @Attribs[0]);
  67.   end;
  68.  
  69.   // fallback to 3.0
  70.   if fRC = 0 then begin
  71.     Attribs[3] := 0;
  72.     fRC := wglCreateContextAttribsARB(fDC, 0, @Attribs[0]);
  73.   end;
  74.  
  75.   // 3.0 context creation failed
  76.   if fRC = 0 then
  77.     raise Exception.Create('Creation of OpenGL 3.0 context failed');
  78.  
  79.   // deactivate and destroy gl 2.0 context
  80.   wglMakeCurrent(fDC, 0);
  81.   wglDeleteContext(gl2Context);
  82.  
  83.   // activate context and load all functionpointer
  84.   ActivateRenderingContext(fDC, fRC);
  85.  
  86.   // Initialization of opengl
  87.   glClearColor(1, 0.5, 0.5, 0);
  88. end;


Hier aber ein bisschen was zu Erklärung des Codes. Ich mache nichts weiter als einen 2.0 Kontext zu erstellen. Dazu gehört das Pixelformat zu definieren (PixelFormatDescriptor) und dann ein passendes Format zu suchen (ChoosePixelFormat) und zu setzen (SetPixelFormat). Anschließend werden die Funktionen zum Erstellen des Kontexts geladen und die Attribute vorbereitet. Wenn das geschafft ist wird versucht einen Kontext zu erstellen. Hat das nicht geklappt wird die Versionsnummer verkleinert.

Vom Prinzip her ziemlich genau das was du (joni) auch machst. Nur mit dem Unterschied, dass ich die in unserem OpenGL Header eingebauten Konstanten/Funktionen benutzen bzw. den 2.0 Kontext nur über wglMakeCurrent aktiviere. ActivateRenderingContext geht her und lädt alle Funktionspointer. Was aber quatsch/nicht nötig ist.


Wobei ich auch gerade sehe, dass dein Fehler wahrscheinlich schon darin liegt, dass du bei der Defintion von TWGLCreateContextAttribsARB vergessen hast ein stdcall mit anzugeben. Ohne Typenkonvention kann es natürlich nicht klappen. Bzw bei dem letzten Parameter tendiere ich eher dazu mich peinlich genau an das zu halten wie es im C/C++ Header definiert ist.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 03, 2009 16:11 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

vielen Dank, es lag wirklich am stdcall. Meine Grafikkarte (HD 5770) sollte eigentlich OpenGL 3.2 können, wenn es denn die Treiber schon gäbe :twisted: (um Missverständnissen vorzubeugen: OpenGL 3.1 kann der Treiber schon).

[Edit]
So, mittlerweile gibts jetzt auch die Treiber für OpenGL 3.2 :D
[/Edit]

Gruß Joni.


Zuletzt geändert von Joni am Mo Feb 01, 2010 10:25, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 10, 2009 14:36 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 19:15
Beiträge: 172
Ja nVidia war diesmal unglaublich schnell mit den ersten Betatreibern. Hab mich auch schon bedankt. :)
Die Kinnlade ist mir aber dann runtergeklappt als ich feststellen musste, dass die Matrizen nicht mehr vorhanden sind. An sonsten sehr positiv, dass es erstmal keine Extensions für 3.2 gibt und alle redundanten Möglichkeiten das selbe zu tun weggefallen sind. Für den Moment hat man also ohne Extensions prüfen zu müssen in einem 3.2er Kontext alles was Spaß macht bereits zur Verfügung.
Für C gibt es auf OpenGL.org eine Header-Datei die sich so einstellen lässt, dass Immediate Mode Befehle und andere gar nicht mehr bekannt sind. Dann kann man auch keine falschen Funktionen mehr aufrufen oder versehentlich Texturformate wählen die es nicht mehr gibt.


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 » Einsteiger-Fragen


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.015s | 15 Queries | GZIP : On ]