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

Aktuelle Zeit: Fr Jul 18, 2025 21:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Select-Modus in OpenGL
BeitragVerfasst: Di Okt 24, 2006 15:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
HIho Leutz,

ich habe mehr oder weniger das Tut von www.delphigl.de zur Objektselektion genutzt.
Auf meinem Rechner funzt das auch wunderbar. Nun tritt auf anderen Rechnern aber ein komisches Verhalten auf. Entweder kommt nen Fehler mit Zugriff auf eine Adresse 0 oder das Programm schmiert ganz ab und schließt sich einfach.
Kann es sein, dass da ein Treiberproblem auftaucht. Welche OpenGL-Version ist denn notwendig für den SELECT-Modus?

Anbei noch der Code:

Code:
  1. // Aufbau: [id][z-wert]
  2. type  SelectArray = array[0..511] of array[0..1] of cardinal;
  3.  
  4. .
  5. .
  6. .
  7.  
  8. function TGeoDataBase.getSelectedObj(x,y : integer;pixels : double;
  9.                                      var  selObjs : SelectArray) : integer;
  10. var         i  : cardinal;
  11.      viewport  : array[0..3] of integer;
  12.     projection : array[0..15] of double;
  13.   SelectBuffer : array[0..512] of integer;
  14.           hits : integer;
  15. begin
  16.    glGetDoublev(GL_PROJECTION_MATRIX,@projection);
  17.    glGetIntegerv(GL_VIEWPORT,@viewport);
  18.  
  19.    glSelectBuffer(512,@SelectBuffer);
  20.    glRenderMode(GL_SELECT);
  21.    glInitNames();
  22.    glPushName(0);
  23.  
  24.    glMatrixMode(GL_PROJECTION);
  25.    glPushMatrix();
  26.      glLoadIdentity();
  27.      gluPickMatrix(x,viewport[3]-y,pixels,pixels,@viewport);
  28.      glMultMatrixd(@projection);
  29.  
  30.      i:= 0;
  31.      while (i <> m_database.Count) do
  32.        begin
  33.           glLoadName(TGeoObject(m_Database[i]).id);
  34.           TGeoObject(m_Database[i]).draw();
  35.           inc(i);
  36.        end;
  37.  
  38.      glMatrixMode(GL_PROJECTION);
  39.    glPopMatrix();
  40.  
  41.    hits:= glRenderMode(GL_RENDER);
  42.    i:= 0;
  43.    while (i <> hits) do
  44.      begin
  45.         selObjs[i][0]:= SelectBuffer[(i*4)+3];
  46.         selObjs[i][1]:= SelectBuffer[(i*4)+1];
  47.  
  48.         inc(i);
  49.      end;
  50.  
  51.    result:= hits;
  52. end;
  53.  


Eine zweite Frage hätt ich noch zum select-Buffer. Der geht ja von 0-512, also 513 integer groß, als Größenangabe im Code steht 512. Soll das so sein(ist übernommen ausm Tut)?

Die Unit wurde auch auf dem entsprechendem Rechner in einem anderen Testprogramm genutzt und kompiliert. Derselbe Fehler, aber bei mir funzt die exe wunderbar.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 25, 2006 07:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hi,

die Selektion ist Grundbestandteil von OpenGL. Also das ist seit der ersten Version verfügbar und hat sich seitdem nicht verändert.

Mit dem Buffer hast du recht. Der ist 1 Element zu groß definiert. Also normal sollte der wohl als [0 .. 511] definiert sein. Aber das ist nicht so tragisch. Andersrum wäre es kritischer.

Ich finde die Selektion so ein wenig ungewöhnlich aufgebaut aber, da es auf dem einen Rechner ja funktioniert denke ich mal, dass das Problem eher woanders liegen wird. Zur Not probier mal andere Selektionprogramme aus. Oder wenn du die Möglichkeit hast es dort zu debuggen dann solltest du sie nutzen. Wenn nicht, dann würde ich massive Logausgaben durchführen um die entsprechende Codestelle ausfindig zu machen.

Sonst finde ich so nichts offensichtliches. Habe aber auch meine Kaffee gerade noch neben mir stehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 26, 2006 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Lossy eX hat geschrieben:
Ich finde die Selektion so ein wenig ungewöhnlich aufgebaut


Inwieweit meinst du das? Für Verbesserungsvorschläge bin ich immer offenn. Wie gesagtr habe das halbwegs ausm Tut übernommen und nur meine Objekte reingepackt.
Das alle selektierten Objekte zurück gegeben werden ist Absicht, die werden "außerhalb" noch nach gewissen Kriterien durchforstet. Die hängen aber mehr mit Objektbeziehungen zusammen und deshalb habe ich die aus dem allgemeinen Picken rausgenommen.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 27, 2006 08:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. Wird wohl eher auch nur gemacht weil man dadurch Fehler vermeiden kann. Also ich kenne es so, dass man eine Renderprocedur hat wärend der Selektion auch nur wieder die RenderProcedur aufruft. Somit hat man die Zeichnerei nur ein mal. Wenn du so halt etwas veränderst dann überträgt sich das auch direkt gleich mit auf die Selektion.

Und das Multiplizieren der Projektsmatrix kommt mir so auch ein bisschen Komisch vor.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 27, 2006 12:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Lossy eX hat geschrieben:
Na ja. Wird wohl eher auch nur gemacht weil man dadurch Fehler vermeiden kann. Also ich kenne es so, dass man eine Renderprocedur hat wärend der Selektion auch nur wieder die RenderProcedur aufruft. Somit hat man die Zeichnerei nur ein mal. Wenn du so halt etwas veränderst dann überträgt sich das auch direkt gleich mit auf die Selektion.

Und das Multiplizieren der Projektsmatrix kommt mir so auch ein bisschen Komisch vor.


So ne Rendermethode gibts in der Klasse, aber ich muss doch vor jedem Objekt noch das glLoadName aufrufen, was ja in der normalen Rendermethode nicht mit drinne steht.

Mit der Matrix das ist so: für das Picken wird doch die Projektionsmatrix mit benötigt. Im Tut wird einfach gluPerspective aufgerufen, Bei mir kann es aber auch orthogonal sein. Daher hole ich einfach die aktuell gesetzte Proj.-Matrix und nutze diese. (das Tut ist übrigens von Sascha hier ausm Forum)

Kann es evtl noch sein, dass das SELECT die Bitmapschriften aus OpenGL nicht verträgt?

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 27, 2006 12:47 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Kannst ja bei der Selektion nen Flag setzen, das dann beim Zeichnen geprüft wird, und nur wenns gesetzt ist, wird der Name geladen. Allerdings stört es auch nicht, wenn Du die Namen immer auf den Stack lädst.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 27, 2006 13:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wie Sidorion auch gesagt hat. Es stört nicht, wenn du LoadNames mit in der normalen Rendermethode drin hast. Genau so stört beim Selektieren die Texturen etc nicht. Diese werden da dann von OpenGL Deaktiviert.

BitmapSchrift: Das sollte im normalen nicht stören. Kannst es aber auch mal testweise rauslassen. Stören tut es nur dann, wenn du für die Schriften den in den OrthoModus wechselst. Dann zerhaut es dir die PickMatrix. Aber schau dir mal den mittleren Quellcode in dem Selektion Artike an. So kannst du zu Beispiel auch eine RenderMethode schreiben die durchaus ihre Unterschiede in der Verarbeitung hat. Siehe Variable RenderMode.

Projektion: Okay. Das MultMatrix müsste eigentlich den gleichen Effekt haben wie es mit gluPerpective der Fall wäre. Hatte da was falsch in Erinnerung.


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 » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.011s | 14 Queries | GZIP : On ]