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
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
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
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.
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:
// ich disable erstmal alles
gl.glDisable(GL.GL_TEXTURE_2D);
gl.glDisable(GL.GL_LIGHTING);
gl.glDisable(GL.GL_BLEND);
gl.glShadeModel(GL.GL_FLAT);
// ich zeichne die Objekte in Bunt
for(Iterator<ISelectable> i = colors.values().iterator(); i.hasNext();)
{
i.next().renderByColor(gl, glu);
}
// hier jetzt ein Buffertausch?
// danach ein glFlush?
//getOwner().arg0.swapBuffers();
//getOwner().getGl().glFlush();{/java]
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..
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
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?^^
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.
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^^
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
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...
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'."
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^^
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.