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

Aktuelle Zeit: Mi Jul 16, 2025 06:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: OpenGL Version
BeitragVerfasst: Mi Dez 21, 2011 12:23 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Hey,

Ich bin gerade etwas verwirrt. Ich dachte eig. immer mit der neusten OpenGL Version zu programmieren aber dies scheint nicht der Fall zu sein. Ich habe hier letztens gelesen, dass z.B. Displaylisten in OpenGL 4.0 rausgeflogen sind oder auch Befehle wie glBegin oder glEnd nicht mehr vorhanden sein sollen. Da dies aber alle bei mir noch funktioniert, heißt es ja, dass ich eine ältere Version nehme (wobei ich 2.X vermute).
Wie kann ich denn herausfinden welche Version nun exakt bei meinem Programm läuft und wie kann ich aufs neuere setzen :?:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL Version
BeitragVerfasst: Mi Dez 21, 2011 15:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
In neueren OpenGL-Versionen fallen alle Immediate-Funktionen weg, sofern man auf einen "puren" Renderkontext setzt. Sprich glBegin, glEnd, glColor, glVertex, Displayliste, etc. etc. fallen weg und man arbeitet nur noch mit VAs/VBOs und Co.

Welche Version du nutzen willst gibts du bei der Erstellung des Kontextes an, und auch ob du einen Kontext willst der rückwärtskompatibel ist (geht auch, also aktuelles OpenGL + alte Funktionen) oder einen der verschlankt ist und auf aktuelle Funktionen setzt.

Um die gewünschte Version (z.B. 3.1, 4.0) zu erhalten muss man zuerst einen normalen Renderkontext erstellen (damit man die Funktionszeiger hat), und dann mittels wglCreateContextAttribsARB (unter Windows) einen Kontext mit den gewünschten Parametern erstellen :
Code:
  1. Attribs[0] := WGL_CONTEXT_MAJOR_VERSION_ARB;
  2. Attribs[1] := MajorVersion;
  3. Attribs[2] := WGL_CONTEXT_MINOR_VERSION_ARB;
  4. Attribs[3] := MinorVersion; 

MajorVersion dann z.B. 4 und Minor 0 für einen 4.0 Renderkontext.

Willst du dann noch einen nur "vorwärtskompatiblen" Kontext, der ohne Altlasten kommt, sprich bei dem immediate Funktionen nicht mehr nutzbar sind, dann muss noch folgendes Attribute dran :
Code:
  1. Attribs[4] := WGL_CONTEXT_FLAGS_ARB;
  2. Attribs[5] := WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB; 


Nicht vergessen dass man die Attributflags mit ner 0 abschliessen muss!

Und dann den Kontext erstellen und den alten löschen :
Code:
  1. Result := wglCreateContextAttribsARB(DC, 0, @Attribs[0]); 

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL Version
BeitragVerfasst: Mi Dez 21, 2011 16:09 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Interessant ist hierbei welche Version deine Grafikkarte und der dazugehörige Treiber hat.

Eine Grafikkarte die OpenGL nur bis 2.0 unterstützt kann z.B. Probleme haben mit Funktionen für OpenGL 2.1 oder höher. Diese Funktionen umschifft der Treiber, was wesentlich langsamer ist weil die CPU das dann berechnet. (Im Grunde sollte es aber funktionieren.)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL Version
BeitragVerfasst: Mi Dez 21, 2011 17:24 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
@Sascha Willems: Okay verstehe! Danke für die Hilfe :)

@SDH.Prod: Ist eine HD 5870 mit aktuellem Treiber, sollte also 4.2 unterstützen.

Edit// Hab dazu auch nochmal folgendes probiert:
Code:
  1.     int OpenGLVersion[2];
  2.     glGetIntegerv(GL_MAJOR_VERSION, &OpenGLVersion[0]);
  3.     glGetIntegerv(GL_MINOR_VERSION, &OpenGLVersion[1]);


Kommt letztendlich 4 und 2 raus, also Version 4.2 ist verfügbar

Edit2//
Hab nun mal bisschen probiert und es war auf 2.1 eingestellt.
Ab Version 3.2 oder höher (3.3, 4.0 - 4.2) wird nix mehr gerendert bei mir - muss ich wohl mal die alten Befehle rausfischen :roll:
Gibt es eigentlich eine Übersicht wo man sieht was alles entfernt wurde?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL Version
BeitragVerfasst: Mi Dez 21, 2011 22:39 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Dabei hilft dir zum einen dies hier:
http://www.opengl.org/documentation/specs/

und im speziellen dies:
http://www.khronos.org/files/opengl41-q ... e-card.pdf
(sofern du nicht Farbenblind bist, diese... Übersicht... arbeitet viel mit Farben), das ist zwar 4.1, aber eine Referenz-Karte für 4.2 gibt es momentan (21.12.2011 22:43 GMT+1) auf der Seite nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL Version
BeitragVerfasst: Do Dez 22, 2011 08:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
was sind eigentlich die Vorteile dabei einen solchen Context aufzusetzen?

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL Version
BeitragVerfasst: Do Dez 22, 2011 09:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Man kann dann nur noch neue Funktionen nutzen, also VAs, VBOs und benötigt auch Shader um irgendwas zu sehen. Das führt dann dazu dass man konsequent nach neuen Standards entwickelt (bzw. entwickeln muss). Die sind dann auf passender Hardware natürlich auch teilweise performanter.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL Version
BeitragVerfasst: Do Dez 22, 2011 11:26 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Also wenn ich garkeinen Shader habe, dann wird mir auch nix angezeigt?
Ich muss also mindest gl_Position festlegen und glColor (und alles was dazu gehört) mit einem Vertex-Shader und Fragment-Shader?!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL Version
BeitragVerfasst: Do Dez 22, 2011 11:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Bei nem Renderkontext der nur vorwärtskompatible ist ja, da muss man dann Shader nutzen, da es keine feste Funktionspipeline mehr gibt. Sprich man muss auch eigene Matrixberechnungen usw. machen.

Edit : Ich poste hier mal ne Funktion zum Erstellen eines Renderkontextes, bei der man auch die Versionsnummer angeben kann. Hab das während der Pulsar-Beta benutzt, im dglHeader ists nicht drin (kann ich aber bei Bedarf machen), KEINE Garantue dass es auch jederzeit und immer korrekt funktioniert :

Code:
  1. function CreateRenderingContextVersion(DC: HDC; Options: TRCOptions; MajorVersion, MinorVersion : Integer; ForwardCompatible : Boolean; ColorBits, ZBits, StencilBits, AccumBits, AuxBuffers: Integer; Layer: Integer): HGLRC;
  2. const
  3.  OBJ_MEMDC          = 10;
  4.  OBJ_ENHMETADC      = 12;
  5.  OBJ_METADC         = 4;
  6.  PFD_DOUBLEBUFFER   = $00000001;
  7.  PFD_STEREO         = $00000002;
  8.  PFD_DRAW_TO_WINDOW = $00000004;
  9.  PFD_DRAW_TO_BITMAP = $00000008;
  10.  PFD_SUPPORT_GDI    = $00000010;
  11.  PFD_SUPPORT_OPENGL = $00000020;
  12.  PFD_TYPE_RGBA      = 0;
  13.  PFD_MAIN_PLANE     = 0;
  14.  PFD_OVERLAY_PLANE  = 1;
  15.  PFD_UNDERLAY_PLANE = LongWord(-1);
  16.  MemoryDCs          = [OBJ_MEMDC, OBJ_METADC, OBJ_ENHMETADC];
  17. var
  18.  PFDescriptor : TPixelFormatDescriptor;
  19.  PixelFormat  : Integer;
  20.  AType        : DWORD;
  21.  LegacyRC     : HGLRC;
  22.  Attribs      : array of Integer;
  23. begin
  24.  
  25. {$IFDEF DGL_WIN64}
  26.  OutPutDebugString('64 Bit Windows');
  27. {$ENDIF}
  28.  
  29. if GL_LibHandle = nil then
  30.  InitOpenGL;
  31.  
  32. if not Assigned(GL_LibHandle) then
  33.  raise Exception.Create('GL_LibHandle is NIL. Could not load OpenGL library!');
  34.  
  35. FillChar(PFDescriptor, SizeOf(PFDescriptor), 0);
  36.  
  37. with PFDescriptor do
  38.  begin
  39.  nSize    := SizeOf(PFDescriptor);
  40.  nVersion := 1;
  41.  dwFlags  := PFD_SUPPORT_OPENGL;
  42.  AType    := GetObjectType(DC);
  43.  
  44.  if AType = 0 then
  45.   RaiseLastOSError;
  46.  
  47.  if AType in MemoryDCs then
  48.   dwFlags := dwFlags or PFD_DRAW_TO_BITMAP
  49.  else
  50.   dwFlags := dwFlags or PFD_DRAW_TO_WINDOW;
  51.  
  52.  if opDoubleBuffered in Options then
  53.   dwFlags := dwFlags or PFD_DOUBLEBUFFER;
  54.  
  55.  if opGDI in Options then
  56.   dwFlags := dwFlags or PFD_SUPPORT_GDI;
  57.  
  58.  if opStereo in Options then
  59.   dwFlags := dwFlags or PFD_STEREO;
  60.  
  61.  iPixelType   := PFD_TYPE_RGBA;
  62.  cColorBits   := ColorBits;
  63.  cDepthBits   := zBits;
  64.  cStencilBits := StencilBits;
  65.  cAccumBits   := AccumBits;
  66.  cAuxBuffers  := AuxBuffers;
  67.  
  68.  if Layer = 0 then
  69.   iLayerType := PFD_MAIN_PLANE
  70.  else
  71.   if Layer > 0 then
  72.    iLayerType := PFD_OVERLAY_PLANE
  73.   else
  74.    iLayerType := Byte(PFD_UNDERLAY_PLANE);
  75.  end;
  76.  
  77. PixelFormat := ChoosePixelFormat(DC, @PFDescriptor);
  78.  
  79. if PixelFormat = 0 then
  80.  RaiseLastOSError;
  81.  
  82. if GetPixelFormat(DC) <> PixelFormat then
  83.  if not SetPixelFormat(DC, PixelFormat, @PFDescriptor) then
  84.   RaiseLastOSError;
  85.  
  86. DescribePixelFormat(DC, PixelFormat, SizeOf(PFDescriptor), PFDescriptor);
  87.  
  88. // Create legacy render context first for we need function pointers to
  89. // create new OpenGL render contexts
  90. LegacyRC := wglCreateContext(DC);
  91. wglMakeCurrent(DC, LegacyRC);
  92.  
  93. // Set attributes to describe our requested context
  94. SetLength(Attribs, 5);
  95. Attribs[0] := WGL_CONTEXT_MAJOR_VERSION_ARB;
  96. Attribs[1] := MajorVersion;
  97. Attribs[2] := WGL_CONTEXT_MINOR_VERSION_ARB;
  98. Attribs[3] := MinorVersion;
  99.  
  100. // Add context flag for forward compatible context
  101. //  Forward compatible means no more support for legacy functions like
  102. //  immediate mode (glvertex, glrotate, gltranslate, etc.)
  103. if ForwardCompatible then
  104.  begin
  105.  SetLength(Attribs, Length(Attribs)+2);
  106.  Attribs[4] := WGL_CONTEXT_FLAGS_ARB;
  107.  Attribs[5] := WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
  108.  end;
  109.  
  110. // Attribute flags must be finalized with a zero
  111. Attribs[High(Attribs)] := 0;
  112.  
  113. // Get function pointer for new context creation function
  114. wglCreateContextAttribsARB := wglGetProcAddress('wglCreateContextAttribsARB');
  115.  
  116. if not Assigned(wglCreateContextAttribsARB) then
  117.  begin
  118.  raise Exception.Create('Could not get function pointer adress for wglCreateContextAttribsARB - OpenGL 3.x and above not supported!');
  119.  wglDeleteContext(LegacyRC);
  120.  exit;
  121.  end;
  122.  
  123. // Create context
  124. Result := wglCreateContextAttribsARB(DC, 0, @Attribs[0]);
  125.  
  126. if Result = 0 then
  127.  begin
  128.  raise Exception.Create('Could not create the desired OpenGL rendering context!');
  129.  wglDeleteContext(LegacyRC);
  130.  exit;
  131.  end;
  132.  
  133. wglDeleteContext(LegacyRC);
  134.  
  135. if Result = 0 then
  136.  RaiseLastOSError
  137. else
  138.  LastPixelFormat := 0;
  139. end;

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL Version
BeitragVerfasst: Do Dez 22, 2011 14:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
Des weiteren emöglicht diese art der Contexterstellung einen debug Context zu bekommen :
Code:
  1.  
  2. WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB or WGL_CONTEXT_DEBUG_BIT_ARB
  3.  


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.009s | 14 Queries | GZIP : On ]