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

Aktuelle Zeit: So Jul 06, 2025 22:58

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Selection & Antialiasing
BeitragVerfasst: So Jan 27, 2008 10:45 
Offline
DGL Member

Registriert: So Aug 06, 2006 08:48
Beiträge: 91
Hallo,

seit ich meinem Projekt Antialiasing verwende sieht man im OGL-Fenster beim Aufruf der Selection-Funktion zum prüfen welches Objekt angeklickt wurde kurz (vermutlich für 1 Frame) Pixelsalat. Die Selection-Funktion ist die aus dem Tutorial:
Code:
  1. //==============================================================================
  2. // Selection
  3. //==============================================================================
  4. function TForm_Main.Selection(xs, ys: integer): integer;
  5. var
  6.   Puffer       : array[0..256] of GLUInt;
  7.   Viewport     : TGLVectori4;
  8.   Treffer,i    : Integer;
  9.   Z_Wert       : GLUInt;
  10.   Getroffen    : GLUInt;
  11. begin
  12.   glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  13.   glSelectBuffer(256, @Puffer);               //Den Puffer zuordnen
  14.  
  15.   glMatrixMode(GL_PROJECTION);                //In den Projektionsmodus
  16.   glRenderMode(GL_SELECT);                    //In den Selectionsmodus schalten
  17.   glPushMatrix;                               //Um unsere Matrix zu sichern
  18.   glLoadIdentity;                             //Und dieselbige wieder zurückzusetzen
  19.  
  20.   gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);
  21.   gluPerspective(Perspective, Viewport[2]/Viewport[3], NearClipping, FarClipping);
  22.  
  23.   Render;                                     //Die Szene zeichnen
  24.   glMatrixMode(GL_PROJECTION);                //Wieder in den Projektionsmodus
  25.   glPopMatrix;                                //und unsere alte Matrix wiederherzustellen
  26.  
  27.   treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  28.  
  29.   Getroffen := High(GLUInt);                  //Höchsten möglichen Wert annehmen
  30.   Z_Wert := High(GLUInt);                     //Höchsten Z - Wert
  31.   for i := 0 to Treffer-1 do
  32.     if Puffer[(i*4)+1] < Z_Wert then
  33.     begin
  34.       getroffen       := Puffer[(i*4)+3];
  35.       Z_Wert := Puffer[(i*4)+1];
  36.     end;
  37.  
  38.   if getroffen = High(GLUInt)
  39.     then Result := -1
  40.   else Result := getroffen;
  41. end;
Was mache ich falsch?


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

Registriert: So Aug 06, 2006 08:48
Beiträge: 91
*push*


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

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. Der Code sieht so nicht falsch aus. Aber ich habe auch noch nie die Selektion mit Antialising benutzt. Das es dort zu fehlern kommt mag ich nicht ausschließen.

Die klassische Selektion ist aber mittlerweile nicht mehr großartig praktikabel. Zu alt zu langsam. Dafür sollte eher eine Farbselektion bevorzugt werden.

Du solltest aber mal überprüfen wann SwapBuffers aufgerufen wird. Kann auch gut sein, dass dieses Problem sonst auch besteht nur eben nicht auftritt, da es ohne Antialising einfach nur schneller ist. Ansonsten gibt es nichts was dafür sorgt, dass das Bild dargestellt wird und es wird ein Problem im Treiber sein.


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

Registriert: So Aug 06, 2006 08:48
Beiträge: 91
Also swapbuffers wird nur am Ende von .Render; aufgerufen. Ist es möglich, dass falsch oder unterschiedlich gesetzte (Farb-)Bits den Fehler verursachen?
Gibt es Tutorials zur Farbselektion?


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

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Genau das meine ich ja. SwapBuffers darf nicht in der Methode Render aufgerufen werden. Denn zur Selektion muss die Szene ein mal gezeichnet werden. Und anschließend muss sie noch einmal richtig gezeichnet werden. Somit bekommst du derzeit immer so ein Murksbild. Nur anscheinend fällt es ohne Antialising nicht groß auf. Also SwapBuffers aus Render entfernen.


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

Registriert: So Aug 06, 2006 08:48
Beiträge: 91
Ah, optimal - jetzt geht's, Vielen Dank! :)


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 6 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.008s | 15 Queries | GZIP : On ]