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

Aktuelle Zeit: Fr Jul 18, 2025 08:47

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



Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 01:49 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ja also soll ich nun für ReadBuffer Back oder Front nehmen?

Also wenn ich ReadPixel auf Front setze und mir nur die SelektionFarben anzeigen lasse und dann klicke, bekomm ich genau die richtigen Farbwerte. nur dann ist meine Szene halt kunterbunt.. wenn ich also die Selektionfarbe zeichnen lasse, die farbe picke und dann die Szene normal zeichne, bekomm ich die normale Farbe und nicht die Selektionsfarbe, obwohl die normale Farbe erst nach den Pick drauf kommt

Irgendwie versteh ich das nicht^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 10:39 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Eventuell ist ein glFinish vorher nötig.
Die Treiber schicken die Aufrufe nicht so wie sie reinkommen raus, sondern optimieren die vorher. Eventuell liegt hier dein Problem.

@Sascha: Guter hinweis mit dem AA. Aber wie willst du in diesem Fall überhaupt das Ergebnis bestimmen. Hast du in deiner Auswertungsfunktion dann ein Delta eingebaut?
Eigentlich könnte man auch sagen: Wer auf den Rand klickt, kann eh nicht erwarten das richtige zu treffen. ;) Dann könnte man den klick einfach ignorieren. Klingt wenig sportlich, ich weiß.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 11:02 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Wo soll das GlFinish nun hin?

Ich habe das ganze jetzt so verstanden: Ich zeichne die bunten Szene, forciere den Buffertausch per glSwapbuffers, mache ein glFinish, und dann picke ich die Farbe mit ReadBuffer auf front.
Alternativ dazu zeichne ich die Szene, tausche den Buffer nicht, mache ein GlFinish, und picke die Farbe mit Readbuffer auf Back

Stimmt das erstmal so von der Theorie?

In der Praxis funkt beides nicht^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 11:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Flash hat geschrieben:
@Sascha: Guter hinweis mit dem AA. Aber wie willst du in diesem Fall überhaupt das Ergebnis bestimmen. Hast du in deiner Auswertungsfunktion dann ein Delta eingebaut?
Eigentlich könnte man auch sagen: Wer auf den Rand klickt, kann eh nicht erwarten das richtige zu treffen. ;) Dann könnte man den klick einfach ignorieren. Klingt wenig sportlich, ich weiß.


Ich wandle den ermittelten Farbwert später in eine Objekt-ID um, die halt dieses Delte berücksichtigt. Und dein letzter Satz sollte so nicht stehen bleiben, denn mit aktivem AA kann es passieren dass die Randfarbe eines Objektes bei einem fehlenden oder zu kleinen Delta der Farbe des nächsten oder vorherigen Objektes entspricht. Dann schlägt die Selektion nicht fehl, sondern trifft ein falsches Objekt, dass ist für den Nutzer ärgerlich und sollte berücksichtigt werden.

Shaddow hat geschrieben:
Wo soll das GlFinish nun hin?

Ich habe das ganze jetzt so verstanden: Ich zeichne die bunten Szene, forciere den Buffertausch per glSwapbuffers, mache ein glFinish, und dann picke ich die Farbe mit ReadBuffer auf front.
Alternativ dazu zeichne ich die Szene, tausche den Buffer nicht, mache ein GlFinish, und picke die Farbe mit Readbuffer auf Back

Stimmt das erstmal so von der Theorie?

In der Praxis funkt beides nicht^^


Die Theorie sieht bei mir so aus :
  • Pickingmatrix um Cursor herum setzen (zwecks Performance)
  • Scissor um Cursor herum setzen (zwecks Performance)
  • Szene in hinteren Puffer rendern, angepasst für Farbselektion (kene Shader, keine Texturen, etc.)
  • Farbe am Cursor mit glReadPixels auslesen (hinterer Puffer)
  • Scissor ausschalten und alles zurücksetzen
  • Farbwerte mit Delta vergleichen


Klappt bei mir seit Jahren reibungslos. Evtl. ist es nötig nach dem Rendern und vorm ReadPixels ein glFlush zu platzieren, aber da PjW bei vielen tausend Leuten läut und ich das nicht drinne hab gehts wohl auch ohne. Farbselektion im Frontpuffer ist ja keine Alternative, immerhin soll der Spieler das ja nicht zu Gesicht bekommen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 12:00 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Okay also im Grunde habe ich das ja in etwa wie du bis auf die Performancedinge, die ich später einbauen würde, die aber grad ohnehin nicht wichtig sind

Code:
  1.  
  2. // ich disable erstmal alles
  3.         gl.glDisable(GL.GL_TEXTURE_2D);
  4.         gl.glDisable(GL.GL_LIGHTING);
  5.         gl.glDisable(GL.GL_BLEND);
  6.         gl.glShadeModel(GL.GL_FLAT);
  7.    
  8. // ich zeichne die Objekte in Bunt 
  9.         for(Iterator<ISelectable> i = colors.values().iterator(); i.hasNext();)
  10.         {
  11.             i.next().renderByColor(gl, glu);
  12.         }
  13.  
  14. // hier jetzt ein Buffertausch?
  15. // danach ein glFlush?
  16.  
  17.         //getOwner().arg0.swapBuffers();
  18.         //getOwner().getGl().glFlush();{/java]
  19.  
  20. Wenn ich das jetzt so durchführe, werden dann die Objekte in den Backbuffer geschrieben? So habe ich es zumindest verstanden. Und dann mit Swapbuffers sind sie ja vorn oder wie? Irgendwie weiss ich nie, wann die Objekte nun in welchem Buffer liegen..
  21.  
  22. [java]
  23.             ByteBuffer buffer = ByteBuffer.allocate(3);
  24.             getOwner().getGl().glReadBuffer(GL.GL_BACK);       
  25.             getOwner().getGl().glReadPixels((int)point.getX(), getOwner().glWindow.getHeight() - (int)point.getY(), 1, 1, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, buffer);
  26.  

Ja sinnvoll den hinteren Buffer auszulesen, aber halt nur, wenn die Objekte dann auch im hinteren Buffer liegen, denn wie gesagt, nach meinem verständnis werden sie in den hinteren Buffer geschrieben und bei Swapbuffers in den vorderen geschoben

Ich kann ja explizit mit DrawBuffer angeben, in welchen Buffer gezeichnet wird, aber wenn ich dort Back angebe, ist dann der Content auch nach dem Swapbuffers noch im Back? Werden die Buffer komplett getauscht oder wird nur der Inhalt getauscht?

Hab es grad mit Drawbuffer auf Back, dann zeichnen, dann swapbuffer und flush und dann readpixel auf back getestet, hilft aber auch nichts


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 12:21 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
okay ich glaub ich habs raus
swapbuffers, flush usw waren alle ueberfluessig
ein irgendwo aktivierter depthtest hat dafür gesorgt, dass meine farbigen objekte nie gezeichnet wurde, wenn ich davor die objekte normal zeichnen lass. ich hab das nicht gemerkt, wiel wenn ich das normale zeichnen deaktiviert habe, wurde der depthtest nicht aktiviert und die farbigen objekte wurden ganz normal wie erwartet gezeichnet^^

naja depthtest vor der selektion uch deaktiviert
und tadaaa^^


das einzig offenstehende Problem, ist dass jetz hin und wieder mal die bunte selektionsszene durchblitzt... obwohl ich in den backbuffer schreibe.. idee?^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 12:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Im Normalfall löscht man auch alle entsprechenden Puffer (Tiefe, Farbe, evtl. noch Stencil) bevor man die Selektion rendert und tut selbiges nochmal nacbdem die Selektion durchgeführt wurde. Dadurch lassen sich genau solche Probleme vermeiden.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 13:06 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ah okay das ist sinnvoll :)
also ich lösch davor und danach color und depthbuffer

das flackern blieb allerdings bestehen. ich denke mal der grund war, dass ich in dem Selektionrendervorgang wirklich nur die zu selektierende Szene gezeichnet hab.. und wenn ich die am ende vorm Swapbuffers mit glClear wieder lösche, dann kommt eben ein schwarzes bild raus, was dann kurz reinflackert. deswegen lass ich nun auch nach der Selektion die Szene nochmal zeichnen und es passt alles wunderbar^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 14:32 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn ich das so durchlese frage ich mich, wieso wir nicht unser Selektionstutorial durch ein Colorpicker-Tutorial ersetzen und das alte Tutorial der vollständigkeit halber unter "Sonstigem" weiter anbieten.
Eigentlich ist das alles kein Hexenwerk und durchaus im Einsteigertutorialpfad richtig aufgehoben.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 14:33 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Jap ich hab mich auch shcon gefragt ob es nicht sinnvoll wäre, da mal ein Tutorial draus zu machen. Ansicht ist es echt nicht schwer, wenn man ein paar Stolpersteine beachtet. Sind aber meiner Meinung nach weniger Stolpersteine als beim OGL eigenen Selectionverfahren...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 14:35 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
blöde Frage, aber wie ist das denn, wenn der User keine 24 Bit Farbtiefe hat, sondern z.B. nur 16 Bit? Ich nehm mal an, das muss man auch berücksichtigen, wenn man glReadPixels verwendet ;) Das Delta ist also nicht nur wegen Anti-Aliasing nötig.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 14:39 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Also ich hab jetz bei mir zb auf byte ebene alles bis auf den Alphawert ausgeschöpft
also 256*256*256*1, das gibt schon ne menge möglichkeiten. Als Delta hab ich mla 5 gewählt sodass also jede Farbe 5 Farbstufen entfernt von der nächsten liegt
Im grunde kann man alpha auch nohc dazu nehmen
Und wenn alles nicht hilft, kann man die farben ja auch in Float angeben, da hat man noch mehr möglichkeiten, nur kann man dann das delta eigentlich nicht wirklich größer machen als bei bytes^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 14, 2009 23:40 
Offline
DGL Member

Registriert: Sa Dez 22, 2007 20:34
Beiträge: 8
Wäre es möglich ein funktionsfähiges Beispiel zu posten, da auch noch andere vor diesem Problem stehen könnten?

Vielen Dank schonmal.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 15, 2009 13:32 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ich weiss nicht, ob die Lösung sonderlich schön ist, aber bei mir funktionierts so:

Code:
  1.  
  2.     public void drawSelectables(GL gl, GLU glu)
  3.     {
  4.         //gl.glDisable(GL.GL_DEPTH_TEST);
  5.         gl.glEnable(GL.GL_DEPTH_TEST);
  6.         gl.glDisable(GL.GL_TEXTURE_2D);
  7.         gl.glDisable(GL.GL_LIGHTING);
  8.         gl.glDisable(GL.GL_BLEND);
  9.         gl.glShadeModel(GL.GL_FLAT);
  10.        
  11.        
  12.         for(Iterator<EI_ISelectable> i = colors.values().iterator(); i.hasNext();)
  13.         {
  14.             i.next().renderByColor(gl);
  15.         }
  16.  
  17.             ByteBuffer buffer = ByteBuffer.allocate(3);
  18.             getOwner().getGL().glReadPixels((int)point.getX(), getOwner().getWindow().getHeight() - (int)point.getY(), 1, 1, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, buffer);
  19.                
  20.             // Übersetzung in einen IntBuffer
  21.             int[] intbuffer = new int[4];
  22.            
  23.             for (int i = 0; i <buffer.limit(); i++)
  24.             {
  25.                 if(buffer.get(i)<0)
  26.                     intbuffer[i] = 256+buffer.get(i);
  27.                 else
  28.                     intbuffer[i] = buffer.get(i);
  29.             }
  30.                
  31.             GLColor tmp = new GLColor(intbuffer[0],intbuffer[1],intbuffer[2],0);
  32.            
  33.             for(Iterator<EI_ISelectable> i = colors.values().iterator(); i.hasNext();)
  34.             {
  35.                 EI_ISelectable s = i.next();
  36.                
  37.                 if (s.getUniqueColor().compareTo(tmp)==1)
  38.                 {  
  39.                     if (mousePressed)
  40.                     {
  41.                         if(curFocus!=null)
  42.                             curFocus.looseFocus();
  43.                        
  44.                         s.gainFocus();
  45.                         curFocus = s;
  46.                        
  47.                         if (!allowMultiSelect)
  48.                             mousePressed = false;
  49.                     }
  50.                    
  51.                     if (useHover)
  52.                     {
  53.                         if(curHover!=null)
  54.                             curHover.looseHover();
  55.                        
  56.                         s.gainHover();
  57.                         curHover = s;                  
  58.                         break;
  59.                     }
  60.                 }
  61.             }
  62.            
  63.            
  64.             getOwner().setInSelectiveMode(false);
  65.             getOwner().getGL().glShadeModel(GL.GL_SMOOTH);
  66.  
  67.  
  68.             getOwner().getGL().glClear(GL.GL_COLOR_BUFFER_BIT);
  69.             getOwner().getGL().glClear(GL.GL_DEPTH_BUFFER_BIT);
  70. }
  71.  
  72.  
  73. // Render Methode
  74. scene.update(time);
  75.  
  76.             gl.glClear(GL.GL_COLOR_BUFFER_BIT);
  77.             gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
  78.            
  79.             if (inSelectiveMode)
  80.                 glSelectionManager.drawSelectables(gl, glu);
  81.  
  82. scene.render(gl);
  83.  


Ist zum Teil richtiger Code zum Teil Pseudocode, aber ich denke mal der Sinn sollte deutlich werden.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 17 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.015s | 16 Queries | GZIP : On ]