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

Aktuelle Zeit: Fr Jul 18, 2025 21:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Selektion unter SDL
BeitragVerfasst: Fr Dez 29, 2006 01:00 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Hallo,

ich habe ein funktionierendes VCL-OpenGL-Projekt nach SDL portiert. Leider funktioniert nun die Selektion, also das Picken von mit glLoadName benannten Objekten nicht mehr. Bevor ich hier sinnlose Mengen Quelltext poste wollte ich fragen, ob es in dieser Konstellation evtl. etwas zu beachten gibt?
Im aktuellen Stand wird zwar erkannt, dass es einen Hit gibt, aber nach der Auswertung des z-Wertes (mehrere Millionen, also falsch, da z des Objektes irgendwo zwischen -100 und 100 liegt) des Treffers wird dieser ausser Betracht gelassen, sodass letztlich doch kein Treffer mehr übrig bleibt.
Diverse Tips im Forum zum Thema habe ich schon probiert, welche in Richtung
- Aufruf von glLoadIdentity und
- gluPerspective
gehen. Hat aber alles nix gebracht. Hat jemand eine Idee, oder tut Quelltext Not?


Grüße, DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 29, 2006 01:46 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
DIe selektion sollte man nicht mehr umbeding benutzen. Schneller sollte es sein, ein FBO mit einer kleinen größe zu benutzen z.B.3x3 und float32 präzision mit mindestens einem Kanal (Z-Buffer nicht vergessen). Die Pickmatrix kann man weiterhin noch mit glupickmatrix erzeugen. nun muss man jedes Poligon oder Vertex in einer anderen Farbe zeichnen (Bei float32 kann man problemlos mehr als 1mio Farben pro Kanal verwenden) Entweder erzeugt man die Farbe zu Fuß oder benutzt in Zukunft einen Geometrieshader in dem man die Poligonnummer in einer Variable auslesen kann (Das wird aber erst in Zukunft sinnvoll sein)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 29, 2006 09:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Ooops. Das klingt ja ziemlich elektrisch. Ist das jetzt wirklich die empfohlene Vorgehensweise? Gibts dazu irgendwo ein Beispiel was dieses Verfahren verdeutlicht?

Grüße, DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 29, 2006 10:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
oc2k1: Die Sache hat nur einen kleinen Hacken. Die wird nämlich nicht mal von OpenGL 2.0 Karten zwingend unterstützt! In meinen Augen ist das "nice to have" wenn es existiert und man unbedingt eine 2 Wege Selektion einbauen oder übertrieben hohe Anforderungen stellen möchte. Wenn die Selektion nicht übertrieben häufig vorkommt denke ich darf man ruhig noch den klassischen Weg benutzen. Vor allem sollte man auch bedenken wo das ganze zum Einsatz kommt. Aber bitte nicht falsch verstehen. Ich denke schon, dass die neue Technik durchaus seine Vorzüge (und Nachteile) hat. Vor allem die Geschwindigkeit dürfte sich Positiv äußern. Und evtl auch bei dem Bereich der Namen. Wobei ich da mit Floats auch Vorsicht walten lassen würde (Genauigkeit). Ich für meinen Teil würde die Technik nur benutzen wenn sie auch zum Rest der Anwenung passt. Wenn der Rest also maximal OpenGL 1.4 ist wären solche Anforderungen etc vollkommen überzogen und sinnfrei.

DNA: Habe bisher noch keine Selektion unter SDL gemacht aber bei bedarf könnte ich das evtl heute abend zu hause mal ausprobieren. Aber normal sollte es ziemlich genau so funktionieren wie ohne SDL auch. Aber zum Verständniss. Das was du als Z Wert bei der Selektion zurückbekommst spiegelt nicht den Z Wert des Objektes wieder! Ja der Wert ist mit dem Z Buffer irgendwie verknüpft aber eine Umrechnung in einen Z Wert dürfte wenn überhaupt möglich wohl doch recht spannend werden. Dieser Wert dient eigentlich nur dazu um herrauszufinden welches Objekt vor welchem liegt etc. Evtl kann es sein, dass SDL Standard eine anderen Auflösung des Z Buffers benutzt wodurch die Werte bei der Selektion verändert werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 29, 2006 10:06 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Man kann doch auch in den normalen Framebuffer schreiben und jedes Polygon mit einer anderen RGBA Farbe versehen. Dann reicht immerhin aus um einen Pointer direkt im Framebuffer abzuspeichern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 29, 2006 18:48 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
@Lars: Meinst du so etwas:
Code:
  1.  
  2.  
  3. var
  4.   myPointer: Pointer;
  5. begin
  6.  
  7.   myPointer := Objekte.GetObjektByName('obj1');
  8.  
  9. glColor4f(r, g, b, Integer(myPointer) );
  10. glBegin(GL_ETWAS);
  11. // das Objekt zeichnen
  12. glEnd();
Denn dann musste man clientseitig ein Objekt-Menager schreiben , das alle objekte speichert (TList oder THashTable vielleicht )

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 29, 2006 19:26 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Ein entsprechendes Beispiel ist in der DGLSDK unter /samples/easysdl verfügbar. Das sollte sich extrem leicht nach reinem SDL portieren lassen.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 29, 2006 20:23 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die Objekte hat man sowieso schon irgendwie gespeichert, aber man braucht keine ID's zu generieren, wenn man den Zeiger direkt als Farbe verwendet. Das kann unter Umständen so eine Art "Selection Manager" ersparen.
Falls man die Objekte aber sowieso schon irgendwie durchnummeriert hat, kann man natürlich dann auch gleich die Nummer verwenden.


Code:
  1. c:=Integer(obj);
  2. glColor4ub(c and $FF, (c and $FF00) shr 8, (c and $FF0000) shr 16,(c and $FF0000) shr 24);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 29, 2006 20:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Funktioniert das mit den Pointern als Farbe eigentlich auch, wenn jemand 16 Bit als Windowsfarbtiefe eingestellt hat und man nicht per Vollbild selber eine Auflösung/Farbtiefe einstellt? Ich bin mir nämlich gerade nicht sicher ob der Framebuffer dann intern auch 32 Bit sein muss und es nur zum zeichnen auf 16 Bit runtergedrückt wird. Weil wenn der Frambuffer als 16 Bit abgelegt werden dann viel Spaß mit den gerundeten Pointern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 29, 2006 21:09 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Zumindest bei Direct3D bekommt man einen 32Bit Backbuffer, wenn man das anfordert. Es scheint also prinzipiell möglich zu sein. Wie es bei OpenGL genau ist, müßte man mal überprüfen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 01, 2007 17:24 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Hallo,

Da mir die vorgeschlagenen Alternativen komplett ungeläufig sind und ich daher für den Zweck einer simplen Menusteuerung bei der Namestackvariante bleiben wollte, habe ich weiterprobiert und auch diverse Bugs gefunden. Lag natürlich wieder an einer (nicht gesetzten und damit falschen) Perspektive. Ok, also die Selektion geht jetzt, leider nur halbwegs.
Es treten 2 Effekte auf, wobei ich den ersten nicht erklären (weil im Tutorial wurde mein eingefügter "Korrekturcode" auch nicht gebraucht) aber fixen konnte. Problem ist, dass nach dem Aufruf von "Selection", mein Menu nicht mehr sichtbar war. Offenbar hatte sich meine Objektmatrix/Kameraposition/however verschoben. Beheben konnte ich das in der Selektionsprozedur mit den letzten 5 Codezeilen:

Code:
  1. function Selection(mx,my:Integer) : integer;
  2. var
  3.   Puffer       : array[0..256] of GLUInt;
  4.   Viewport     : TGLVectori4;
  5.   Treffer,i    : Integer;
  6.   Z_Wert       : GLUInt;
  7.   Getroffen    : GLUInt;
  8. begin
  9.   glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  10.   glSelectBuffer(256, @Puffer);               //Den Puffer zuordnen
  11.  
  12.   glMatrixMode(GL_PROJECTION);                //In den Projektionsmodus
  13.   glRenderMode(GL_SELECT);                    //In den Selectionsmodus schalten
  14.   glPushMatrix;                               //Um unsere Matrix zu sichern
  15.   glLoadIdentity;                             //Und dieselbige wieder zurückzusetzen
  16.  
  17.   gluPickMatrix(mx, viewport[3]-my, 1, 1, viewport);
  18.   gluPerspective(60.0, Viewport[2]/Viewport[3], 1, 256);
  19.   Render;
  20.   glMatrixMode(GL_PROJECTION);                //Wieder in den Projektionsmodus
  21.   glPopMatrix;                                //und unsere alte Matrix wiederherzustellen
  22.  
  23.   treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  24.  
  25.   Getroffen := High(GLUInt);                  //Höchsten möglichen Wert annehmen
  26.   Z_Wert := High(GLUInt);                     //Höchsten Z - Wert
  27.   for i := 0 to Treffer-1 do
  28.     if Puffer[(i*4)+1] < Z_Wert then
  29.     begin
  30.       getroffen       := Puffer[(i*4)+3];
  31.       Z_Wert := Puffer[(i*4)+1];
  32.     end;
  33.  
  34.   if getroffen=High(GLUInt)
  35.     then Result := -1
  36.     else Result := getroffen;
  37.  
  38.   glMatrixMode( GL_PROJECTION );
  39.   glLoadIdentity;
  40.  
  41.   gluPerspective( 60, Viewport[2]/Viewport[3], 1, 256 );
  42.  
  43.   glMatrixMode( GL_MODELVIEW );
  44.   glLoadIdentity;
  45. end;
  46.  


Das ist für mich nicht direkt erklärbar, lies sich aber mit o.g. Geflick beheben.


Das eigentliche Problem (evtl. Folgeproblem?) tritt bei der Selektion auf. Und zwar werden die Namen der ersten beiden Klicks korrekt ermittelt. Ab dem dritten Klick wird nur noch der Name des dritten Elements (Button2/1005) geliefert, außer man erwischt das zweite Element (Button1/1001), dessen Name irgendwie immer korrekt ermittelt wird.
Letztlich gibt es folgende Namen auf dem Stack:
999: //Rückseite um "Danebenklicken" abzufangen
1001: Button1 // wird immer korrekt ermittelt
1005: Button2 // die "Pauschalantwort" ab dem dritten Klick. Die Lücke zwischen 1001 und 1005 entsteht durch unterpunkte von 1001, welche aber nicht gerendert werden.
1006: Button3
1007: Button4
1008: Button5


Das Rendern der Szene geschieht hier:
Code:
  1. procedure Render;
  2. begin
  3.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  4.   Game.DrawGame;  // ruft im aktuellen Gamestate nur das Menu auf
  5.   SDL_GL_SwapBuffers;
  6. end;
  7.  


Das Rendern der Menuknöpfe geschieht hiermit:
Code:
  1.  
  2. procedure TVMenu.DrawMainMenu(index:Integer);
  3. var v:Tvector3f;
  4.     i,SubMenuId:Integer;
  5.     rm:Integer;
  6. begin
  7.   glPushMatrix;
  8.   glInitNames;
  9.   glPushName(0);
  10.   glLoadName(999);
  11.   glBegin(GL_QUADS);  //  Rückwand für Fehlklicks
  12.       glVertex3f(-15,+15,-40);
  13.       glVertex3f(+15,+15,-40);
  14.       glVertex3f(+15,-15,-40);
  15.       glVertex3f(-15,-15,-40);
  16.   glEnd;
  17.  
  18.   //  einzelne Buttonelemente
  19.   for i:=0 To Pred(Items[index].SubmenuItemId.count) do
  20.   begin
  21.     glTranslatef( 0, 6-3*i, -20);
  22.     SubMenuId:=Items[index].SubmenuItemId.GetItem(i);
  23.     glLoadName(1000+SubMenuId);
  24.     glEnable(GL_TEXTURE_2D);
  25.     glCallList(Items[SubMenuId].displiste);
  26.     glDisable(GL_TEXTURE_2D);
  27.     glPopMatrix;
  28.     glPushMatrix;
  29.   end;
  30.   glPopName;
  31. end;
  32.  


Die Namen werden korrekt auf den Stack geschrieben, nur bei Auslesen hapert es. Hat jemand eine Idee?

Grüße und Dank im Voraus,
DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 04, 2007 20:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Hat keiner eine Idee, oder ist das Problem unbrauchbar beschrieben?

Grüße, DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 04, 2007 21:03 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Wieso hast du beim Rendern als letztes ein glPopName?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 05, 2007 08:41 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Hallo i0n0s

i0n0s hat geschrieben:
Wieso hast du beim Rendern als letztes ein glPopName?

Es ändert sich nichts, wenn ich es weglasse. Aber ich las im Wiki http://wiki.delphigl.com/index.php/Selektion davon.

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 05, 2007 09:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
i0n0s hat geschrieben:
Wieso hast du beim Rendern als letztes ein glPopName?

Die Namen sind auch stackbasiert. Es besteht also auch die Möglichkeit, dass man mehrere Namen auf den Stack packen kann. Da dieser Stack allerdings nur wärend der Selektion existiert wird er anschließend von OpenGL wieder gelöscht und somit automatisch gelehrt aber eine Berechtigung hat dieser Befehl auch. In diesem Falle hat er zwar keine große Auswirkung, da es wirklich "das Letzte" ist aber das könnte er aber. Und da sollte man sich gar nicht erst angewöhnen, dass es klappt. Muss es ja nicht zwingend. ;-)

DNA hat geschrieben:
Problem ist, dass nach dem Aufruf von "Selection", mein Menu nicht mehr sichtbar war. Offenbar hatte sich meine Objektmatrix/Kameraposition/however verschoben. Beheben konnte ich das in der Selektionsprozedur mit den letzten 5 Codezeilen:

Das Problem ist, dass durch gluPickMatrix die Ansicht für die Selektion verändert wird. Entweder sicherst du deine Matritx mit glPushMatrix/glPopMatrix oder du setzt sie nach der Selektion neu. Wobei du sie ja aber gesichert hast. Was wiederrum irgendwie ein bisschen komisch ist.

Zu deinem Selektionproblem. Ich befürchte mit so wenig Code werden wir dir nicht helfen können. Das Problem ist, dass du wärend der Selektion wirklich alles 100%tig genau so machen musst wie ohne Selektion. Bzw darfst wärend der Selektion auch wirklich nur rendern. Also nicht mal die Ansicht darfst du umstellen. Und da genügt manchmal schon die kleinste Kleinigkeit damit es nicht mehr so geht. Also bitte ich dich, dass du (wenn möglich) dein Projekt mal zipst und hier postest, auf deine Seite lädst oder es mir per Mail zuschickst. Und bitte darauf achten, dass alle benötigten Dateien dabei sind.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
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.011s | 14 Queries | GZIP : On ]