ich verwende glReadPixels(X,Y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@Z) zum Auslesen der Tiefe eines Pixels, doch mach ich entweder was gründlich falsch, oder die Funktion liefert die Tiefe nicht als Weltkoordinate (also nicht als Entfernung in der gleichen Einheit wie die ganzen Vertex-Angaben).
Um jedoch damit mittels gluUnproject weiterrechnen zu können, brauch ich Z so (denk ich wenigstens), oder aber als Wert zwischen 0 und 1.
Kann mir jemand weiterhelfen, wie ich das umrechnen kann oder was ich falsch verstanden habe?
Den Umweg über die Funktion getDepth mache ich, weil ich die Funktion UnProject später für reine Richtungsvektoren brauche, bei denen die Länge keine Rolle spielt.
Wenn jemand mir da weiterhelfen kann, wäre ich sehr dankbar.
glReadPixels normiert auf [0;1]. Wenn Du den Wert mit znear und zfar verwurstelst, solltest Du den tatsächlichen z-Wert bekommen.
Allerdings kannst Du gluUnProject mehrmals rufen, also in GetDepth und Unproject.
_________________ 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.
Ich brauche einen Z-Wert, mit dem ich über gluUnproject weiterarbeiten kann, und den liefert glReadPixels anscheinend nicht.
Jedenfalls hab ich mal den Result-Punkt von gluUnproject mit einer Kugel in der gerenderten Szene markiert;
und er lag zwar immer unter dem Cursor, aber der Abstand zur Kamera war bei weitem zu gering.Der Punkt hat praktisch auf der Linse geklebt.
Wenn ich allerdings einen Wert über 1 manuell als Z-Wert eingegeben habe statt getDepth zu verwenden, war die Kugel schon außerhalb des Sichtfeldes.
BTW: kann es sein, dass Y_new in dem Wiki-Beispiel TGlInt sein muss und nicht TGlDouble?
Eher X und Y GLDouble. Integer und Double brauchen zwar jeder 32 Bit, sind aber unterschiedlich 'formatiert'. Wenn Du jetzt einen Integer als Double übergibst, geht das schief. Versuch mal vor dem gluUnProject die Übergabewerte X und Y in einen GLDouble zu schreiben.
Normalerweise klappt die Zuweisung von nem Int auf einen Double in Delphi (dabei verliert man dann aber u.U. signifikante Stellen), aber das gluUnProject ist immerhin eine Funktion in einer DLL, da weis man nie, wie der Wert interpretiert wird. Laut Wiki müssen winX, winY und winZ GLDouble sein.
Das selbe Problem hast Du wenn du schreibst dMyDouble:=double(iMyInt). Da kommt auch Murks raus.
_________________ 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.
Da ich ReadPixels außerhalb der Renderprozedur verwende, wird bis dahin immer schon SwapBuffers(GLForm.FDC) ausgeführt, was meines Verständnisses nach Front- und Backbuffer vertauscht. ReadPixels greift damit auf den nicht mehr aktuellen Backbuffer zu und liefert irgendeinen unsinnigen/leeren Wert zurück.
Zwei Fragen:
1. Kann das stimmen?
2. Wenn das stimmt, wie kann man trotzdem auf das richtige Bild und dessen Tiefenbuffer zugreifen?
Mitglieder in diesem Forum: 0 Mitglieder und 19 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.