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

Aktuelle Zeit: Fr Jul 18, 2025 12:42

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme mit glgetIntegerV
BeitragVerfasst: Sa Aug 11, 2007 05:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
Hallo,

um abzuprüfen wieviele Textureinheiten verfügbar sind verwende ich die Funktion glGetIntegerV.
Leider liefert die Funktion mit dem Wert GL_MAX_TEXTURE_UNITS kein sinnvolles Ergebnis. Der
Aufruf von glGetIntegerV mit anderen Werten hingegen liefert die erwarteten Ergebnisse
(z.B.
Code:
  1.  
  2.   glGetIntegerV (GL_MAX_ELEMENTS_VERTICES, @FMaxTextureUnits);
  3.   glGetIntegerV (GL_MAX_ELEMENTS_INDICES, @FMaxTextureUnits);
  4.  

)
Die Funktion glGetError liefert mir immer den Wert GL_INVALID_ENUM. In FMaxTextureUnits
bleibt der vorher abgelegte Wert erhalten.

Code:
  1.  
  2. private
  3.     FMaxTextureUnits: glInt;
  4.    .
  5.    .
  6.    .
  7.  
  8.  
  9. constructor TTest.Create(AOwner:TComponent);
  10. begin
  11.   glGetIntegerV (GL_MAX_TEXTURE_UNITS, @FMaxTextureUnits);
  12.   if not CheckNoError (glGetError) then
  13.     FMaxTextureUnits := 0;
  14.    .
  15.    .
  16.    .
  17.  
  18.  
  19. function CheckNoError (err: GLenum): boolean;
  20. // die funktion wurde nur für den debugger angelegt. wenn ich hier durhgehe
  21. // kann ich sehen welcher fehler aufgetreten ist.
  22. begin
  23.   result := true;
  24.   case err of
  25.   GL_INVALID_ENUM:
  26.     result := false;                        // hier lande ich dann immer
  27.   GL_INVALID_VALUE:
  28.     result := false;
  29.   GL_INVALID_OPERATION:
  30.     result := false;
  31.   GL_STACK_OVERFLOW:
  32.     result := false;
  33.   GL_STACK_UNDERFLOW:
  34.     result := false;
  35.   GL_OUT_OF_MEMORY:
  36.     result := false;
  37.   end;
  38. end;
  39.  




Ich benutze folgende dglOpenGL:

{==============================================================================}
{ }
{ OpenGL 2.1 - Headertranslation (includes GL 1.1 - 2.1) }
{ Version 2.1 }
{ Date : 20.02.2007 }
{ }
{ Works with : }
{ - Delphi 3 and up }
{ - FreePascal (1.9.3 and up) }
{ }
{==============================================================================}


Vielen Dank schon mal,

Andree


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 11, 2007 09:12 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Probier mal mit GL_MAX_TEXTURE_IMAGE_UNITS.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 11, 2007 09:16 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Vielleicht statt
Code:
  1. GL_MAX_TEXTURE_UNITS
folgendes eingeben :
Code:
  1. GL_MAX_TEXTURE_UNITS_ARB
(siehe Fehlertyp: GL_INVALID_ENUM)

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 11, 2007 09:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
GL_MAX_TEXTURE_UNITS und GL_MAX_TEXTURE_UNITS_ARB sind genau das Gleiche. Im Header sind das zwar zwei unterschiedliche Konstanten aber bei OpenGL kommt immer nur der selbe Wert an.

Und etwas anderes wie ich finde nicht ganz unwichtiges. GL_MAX_TEXTURE_UNITS und GL_MAX_TEXTURE_IMAGE_UNITS bedeuten nicht das Gleiche. GL_MAX_TEXTURE_IMAGE_UNITS ist die Anzahl der TMUs die in einem Shader verfügbar sind. Die Anzahl der TMUs ohne Shader ist auf neueren Karten bei ATI eigentlich 8 und auf NV irgendwas zwischen 4-8. Im Shader aber 16.

Bei mir (ATI X800 GTO) funktioniert der Aufruf problemlos. Stell bitte sicher, dass OpenGL zu dem Zeitpunkt initialisiert und aktiviert ist. Bzw überprüfe auch mal welche Version von OpenGL du vor dir hast. Dazu gibt es im Header verschiedene Konstanten. GL_VERSION_1_1 etc. Für GL_MAX_TEXTURE_UNITS wird OpenGL 1.3 verrausgesetzt oder aber die Extension GL_ARB_multitexture. Und das kann heutzutage eigentlich nur dann nicht erfüllt sein, wenn du Probleme mit dem Treiber hast oder dich im Softwaremodus befindest. (Was beides wohl auf das Gleiche hinausläuft)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: scheint alle korrekt zu sein
BeitragVerfasst: So Aug 12, 2007 17:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
Hallo,

opengl ist up and running. während ich den funktionsaufruf mache um die version zu lesen, dreht sich im hintergrund eine gerenderte kugel. müsste also alles korrekt initialisiert sein.

wie ich in meinem eingangsartikel geschhrieben habe, verwende ich die dglOpengl.pas version 2.1

die darin deklarierten versionsvariablen gehen bis 2.1


GL_VERSION = $1F02;

ist das korrekt?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 12, 2007 17:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja $1F02 ist richtig.

Und mir ging es nicht darum welche Version des Headers du verwendest sondern welche Versionsvariablen gesetzt sind? Also welche Version von OpenGL du da hast? Das kannst rausfinden in dem du schaust welche von dieses GL_VERSION_?_? gesetzt sind. Denn für GL_MAX_TEXTURE_UNITS wird OpenGL 1.3 (GL_VERSION_1_3 muss gesetzt sein) verrausgesetzt. Wenn das nicht der Fall ist dann bekommst du eben den invalid enum fehler, da OpenGL das halt noch nicht kennt.

Für GL_MAX_TEXTURE_IMAGE_UNITS wird OpenGL 2.0 verrausgesetzt. Aber das ist es eigentlich was anderes.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Hier sind die Versionsinformationen
BeitragVerfasst: Di Aug 14, 2007 03:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
Hallo,

folgendes habe ich herausgefunden:

GL_Version 1.0 = True
GL_Version 1.1 = True
GL_Version 1.2 = False
GL_Version 1.3 = False
GL_Version 1.4 = False
GL_Version 1.5 = False
GL_Version 2.0 = False
GL_Version 2.1 = False
GL_Version 1.1 = True
GL_Version 1.2 = True
GL_Version 1.3 = False
----------------------------------------------------
Vendor:
Microsoft Corporation
----------------------------------------------------
Renderer:
GDI Generic
----------------------------------------------------
Version:
1.1.0
----------------------------------------------------
Extensions:
GL_WIN_swap_hint
GL_EXT_bgra
GL_EXT_paletted_texture

Die Ausgaben werden mit folgendem Code erzeugt:

Code:
  1.  
  2.   MemoGLProp.Lines.Add('GL_Version 1.0 = '+StrIf (GL_VERSION_1_0, 'True', 'False'));
  3.   MemoGLProp.Lines.Add('GL_Version 1.1 = '+StrIf (GL_VERSION_1_1, 'True', 'False'));
  4.   MemoGLProp.Lines.Add('GL_Version 1.2 = '+StrIf (GL_VERSION_1_2, 'True', 'False'));
  5.   MemoGLProp.Lines.Add('GL_Version 1.3 = '+StrIf (GL_VERSION_1_3, 'True', 'False'));
  6.   MemoGLProp.Lines.Add('GL_Version 1.4 = '+StrIf (GL_VERSION_1_4, 'True', 'False'));
  7.   MemoGLProp.Lines.Add('GL_Version 1.5 = '+StrIf (GL_VERSION_1_5, 'True', 'False'));
  8.   MemoGLProp.Lines.Add('GL_Version 2.0 = '+StrIf (GL_VERSION_2_0, 'True', 'False'));
  9.   MemoGLProp.Lines.Add('GL_Version 2.1 = '+StrIf (GL_VERSION_2_1, 'True', 'False'));
  10.   MemoGLProp.Lines.Add('GL_Version 1.1 = '+StrIf (GLU_VERSION_1_1, 'True', 'False'));
  11.   MemoGLProp.Lines.Add('GL_Version 1.2 = '+StrIf (GLU_VERSION_1_2, 'True', 'False'));
  12.   MemoGLProp.Lines.Add('GL_Version 1.3 = '+StrIf (GLU_VERSION_1_3, 'True', 'False'));
  13.   MemoGLProp.Lines.Add('----------------------------------------------------');
  14.  
  15.   info := glGetString (GL_VENDOR);
  16.   if info <> '' then
  17.   begin
  18.     MemoGLProp.Lines.Add(MemoResStrVendor);
  19.     MemoGLProp.Lines.Add(info);
  20.     MemoGLProp.Lines.Add('----------------------------------------------------');
  21.   end;
  22.   info := glGetString (GL_RENDERER);
  23.   if info <> '' then
  24.   begin
  25.     MemoGLProp.Lines.Add(MemoResStrRenderer);
  26.     MemoGLProp.Lines.Add(info);
  27.     MemoGLProp.Lines.Add('----------------------------------------------------');
  28.   end;
  29.   info := glGetString (GL_VERSION);
  30.   if info <> '' then
  31.   begin
  32.     MemoGLProp.Lines.Add(MemoResStrVersion);
  33.     MemoGLProp.Lines.Add(info);
  34.     MemoGLProp.Lines.Add('----------------------------------------------------');
  35.   end;
  36.   info := glGetString (GL_EXTENSIONS);
  37.   Split (info, ' ', infolines);
  38.   if info <> '' then
  39.   begin
  40.     MemoGLProp.Lines.Add(MemoResStrExtensions);
  41.     for i := 0 to infolines.Count-1 do
  42.       MemoGLProp.Lines.Add(infolines[i]);
  43.   end;
  44.  



Jetzt weiß ich also, dass meine laufende OpenGLversion 1.1 ist. Ist das von der Grafikkarte abhängig? Das Problem tauchte nämlcih erst auf, seit ich eine billige noname karte eingebaut habe, nachdem meine alte abgeraucht ist.

Danke,

Andree[pascal]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 14, 2007 10:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Diese Karte hat keine Hardwarebeschleunigung. Das sieht man daran, dass dort als Vendor Microsoft steht bzw GDI Generic als Renderer. Damit identifiziert sich die Softwareimplementation von Microsoft. Und da ist wie ich oben schon gesagt hatte Multitexturing nicht verfügbar. Was den Fehler erklärt.

Aber sonst solltest du schauen, dass du einen aktuellen Treiber drauf hast und auch ob die Hardwarebeschleunigung aktiv ist. Unter "Eigenschaften der Anzeige" -> "Einstellungen" -> "Erweitert" -> "Problembehandlung" sollte der Schieber ganz Rechts sein.

Aber normal sollten eigentlich alle Karten seit 10 Jahren zu mindest etwas Hardwarebeschleunigung haben. Außer bei OnBoard da wäre ich vorsichtig. Sonst hatte ich es auch schon mal erlegt, dass sich Treiber nicht richtig registriert hatten und deswegen opengl in Software lief. Also im Zweifel noch Treiber komplett runter und wieder neu installieren.


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


Wer ist online?

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