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

Aktuelle Zeit: So Jul 06, 2025 23:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Feb 01, 2008 23:37 
Offline
DGL Member

Registriert: Fr Dez 28, 2007 20:24
Beiträge: 62
Wohnort: Berlin
Ich habe schon ein paar Themen mittles Suche gefunden nur scheint mein Problem dadurch nicht behoben.
Ich habe die Selectfunktion aus dem Tutorial für mein Programm übernommen, jedoch funktioniert es rein garnicht. Er gibt mir zwar keine Fehlermeldungen doch liefert die Funktion immer nur -1 als Ergewbnis.

Code:
  1.  
  2.  
  3.  
  4. procedure TClient.FormCreate(Sender: TObject);
  5. begin
  6.  DC:= GetDC(Form.Handle);
  7.  if not InitOpenGL then Application.Terminate;
  8.  RC:= CreateRenderingContext( DC,[opDoubleBuffered],32,24,0,0,0,0);
  9.  ActivateRenderingContext(DC, RC);
  10.  SetUpGL;
  11.  Application.OnIdle := IdleHandler;
  12. end;
  13.  
  14. procedure TOpenGLInit.Render;
  15. begin
  16.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  17.   glMatrixMode(GL_PROJECTION);
  18.   glLoadIdentity;
  19.   gluPerspective(45.0, Client.Width/Client.Height, NearClipping, FarClipping);
  20.   glMatrixMode(GL_MODELVIEW);
  21.   glRenderMode(GL_RENDER);
  22.   glLoadIdentity;
  23.  
  24.   glInitNames;
  25.   glPushName(0);
  26.   gltranslatef(0,0,-5);
  27.   glColor3f(1,0,0);
  28.   glLoadName(dreieck);
  29.   glBegin(gl_triangles);
  30.     glVertex3f(-0.5,1,0);
  31.     glVertex3f(0.5,1,0);
  32.     glVertex3f(0,2,0);
  33.   glEnd;
  34.  
  35.   SwapBuffers(DC);
  36. end;
  37. ...
  38. function TOpenGlInit.Selection : integer;
  39. var
  40. Puffer         : array[0..256] of GLUInt;
  41. Viewport     : TGLVectori4;
  42. Treffer,i      : Integer;
  43. Z_Wert       : GLUInt;
  44. Getroffen    : GLUInt;
  45. begin
  46.  glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  47.  glSelectBuffer(256, @Puffer);                         //Den Puffer zuordnen
  48.  glRenderMode(GL_SELECT);                          //In den Selectionsmodus schalten
  49.  glmatrixmode(gl_projection);                        //In den Projektionsmodus
  50.  glPushMatrix;                                               //Um unsere Matrix zu sichern
  51.  glLoadIdentity;                                             //Und dieselbige wieder zurückzusetzen
  52.  gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);
  53.  gluPerspective(60.0, Viewport[2]/Viewport[3], 1, 256);
  54.  Render;                                                      //Die Szene zeichnen
  55.  glmatrixmode(gl_projection);                       //Wieder in den Projektionsmodus
  56.  glPopMatrix;                                                //um unsere alte Matrix wiederherzustellen
  57.  
  58.  Treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  59.  
  60.  Getroffen := High(GLUInt);                          //Höchsten möglichen Wert annehmen
  61.  Z_Wert := High(GLUInt);                             //Höchsten Z - Wert
  62.  for i := 0 to Treffer-1 do
  63.  if Puffer[(i*4)+1] < Z_Wert then
  64.   begin
  65.    getroffen       := Puffer[(i*4)+3];
  66.    Z_Wert := Puffer[(i*4)+1];
  67.   end;
  68.  Result := getroffen;
  69. end;
  70.  


xs und ys werden im Mousedown übergeben.

Ich habe mir auch schon das Programm zum Tutorial herunter geladen, dort sind aber Quelltextunterschiede zum Tut in der wiki. Hinzu kommt eine endloslange nicht für mich Nachvollziehbare procedure die sich SetupPixelFormat nennt und eine Exepction an der Adresse 0000 wenn ich das ganze versuche zu übernehmen -.-


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 01, 2008 23:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
In der Funktion Render setzt du erneut die perspektivische Matrix, und überschreibst daher die Pickingmatrix in deiner Selektionsfunktion, dann kann die Selektion natürlich nicht funktionieren.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 01, 2008 23:59 
Offline
DGL Member

Registriert: Fr Dez 28, 2007 20:24
Beiträge: 62
Wohnort: Berlin
Und was soll ich jetzt machen?
Wenn ich das setzen der Perspektive aus Render rausnehme sehe ich das Dreieck aber nicht mehr.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 02, 2008 00:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenn du im Selektionsmodus bist, setzt du die Perspektive in Render halt nicht. In welchem Modus man sich befindet lässt sich mittels glGet ermitteln (siehe Wiki).

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 02, 2008 00:08 
Offline
DGL Member

Registriert: Fr Dez 28, 2007 20:24
Beiträge: 62
Wohnort: Berlin
Code:
  1.  
  2. procedure TOpenGLInit.Render;
  3. begin
  4.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5.   glMatrixMode(GL_PROJECTION);
  6.   glLoadIdentity;
  7.  
  8.   if not GL_Render_mode=GL_Select then   // ???? SO Richtig ????
  9.   gluPerspective(60.0, Client.Width/Client.Height, NearClipping, FarClipping);
  10.  
  11.   glMatrixMode(GL_MODELVIEW);
  12.   glRenderMode(GL_RENDER);
  13.   glLoadIdentity;
  14. ...
  15.  


Damit Zeichnet er auch kein Dreieck mehr ...
Er sagt der Vergleich ergibt immer false?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 02, 2008 00:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Nein, ich hab ja oben geschrieben glGet(Integer), und dann als Token GL_RENDER_MODE, so erhälst du dann als Rückgabewert entweder GL_RENDER oder GL_SELECT.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 02, 2008 10:35 
Offline
DGL Member

Registriert: Fr Dez 28, 2007 20:24
Beiträge: 62
Wohnort: Berlin
*edit* Hab es anders gelöst das Problem.
Code:
  1.  
  2. glMatrixMode(GL_MODELVIEW);
  3. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Farb und Tiefenpuffer löschen
  4. glLoadIdentity;
  5.  

Wenn ich jedoch jetzt mehrere Objekte Zeichne geben Manche trotzdem -1 zurück, woran kann das liegen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 02, 2008 13:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Code:
  1. glGetIntegerv(GL_RENDER_MODE, @RenderMode)


Wobe RenderMode vom Typ Integer ist. Dann steht dort entweder der Wert von GL_SELECT oder GL_RENDER, anhand dessen kannst du dann unterscheiden. Die Perspektive musst du beim normalen Rendern ja so oder so setzen.

Kleiner Hinweis : OpenGL-Selektion sollte man eigentlich nicht mehr verwenden, bei NVidia ist diese seit dem Rel90-Treiber z.B. unbrauchbar langsam. Daher sollte man selbst z.b. Farbseletkion implementieren, dazu gibts hier im Forum einige Beiträge.

_________________
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  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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