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

Aktuelle Zeit: Do Jul 03, 2025 09:40

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



Ein neues Thema erstellen Auf das Thema antworten  [ 24 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: Abstand messen im 3D-Raum
BeitragVerfasst: Di Jun 22, 2010 09:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
zu 1: Du renderst die Szene mit glColorMask(false, false, false, false). Dadurch wird nur in den Z-Buffer geschrieben. Im folgenden zweiten Renderdurchgang in dem die eigentlichen Kanten gerendert werden sind somit nur die Kanten sichtbar die vorne liegen. Durch Rundungsfehler kann es aber nun passieren das Z-Werte die eigentlich gleich sein sollten leicht unterschiedlich sind. Dadurch könnten einige eigentlich sichtbare Pixel nicht sichtbar sein, weil der Wert im Z-Buffer an der entsprechenden Stelle leicht größer ist. Das nennt sich Z-Fighting. Hier hilft z.B. ein glDepthRange(0.01, 1) vor dem ersten Render-Durchgang und ein glDepthRange(0, 1) vor dem zweiten Durchgang. Dadurch werden sämtliche Z-Werte im ersten Durchgang ganz leicht nach hinten geschoben.

zu 1.1: Das Problem wird durch 1. gelöst.

zu 2.: Es ist nicht möglich eine 2D-Cursor-Position in einen 3D-Punkt um zu wandeln. Das Ergebnis ist immer eine Gerade von der Kameraposition durch den von gluUnProject berechneten Punkt. Diese Gerade musst du mit der selektierten Kante schneiden. Dabei kann es natürlich passieren das es keinen exakten Schnittpunkt gibt, daher berechne den Punkt auf der Kante der den kleinsten Abstand zur Geraden hat.
Eine Alternative ist den Z-Wert aus dem FBO auszulesen und den erhaltenen 3D-Punkt durch gluUnProject zu jagen. Da der 3D-Punkt aber quantisiert (gerundet) wird, ist das möglicherweise nicht genau genug. Der Punkt wird also höchstwahrscheinlich nicht genau auf deiner Kante liegen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abstand messen im 3D-Raum
BeitragVerfasst: Di Jun 22, 2010 10:17 
Offline
DGL Member

Registriert: Mi Okt 21, 2009 14:02
Beiträge: 22
Hallo,
1. Werde ich gleich mal ausprobieren.

2. Ich hatte bereits eine Funktion die den kleinsten Abstand zwischen Punkt/Cursor und Kante ermittelt und daraus den Punkt auf der Kante ermittelt. Die Idee mit der Geraden werd ich gleich mal probieren, ich hatte gestern was ähnliches überlegt, wollte aber eine Schnittebene nehmen. Auf ne Gerade bin ich natürlich nicht gekommen :oops:

Gerade bin ich dabei über das FBO den Tiefenpuffer auzulesen. Anstellen tue ich das auf diese Weise:
Code:
  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFbo.mObjectID);
  glReadPixels(0, 0, Range*2, Range*2, GL_DEPTH_COMPONENT, GL_FLOAT, @Z );
  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

Die Position hätte ich dann aus der Textur ermittelt und hier den Wert abgefragt. Jedoch scheint es dass ich diese Werte nicht wirklich nutzen kann da sie (ich nehme mal an) durch die Perspektive verzerrt im Puffer liegen. ( Eine rechtwinklige Ecke ist dabei ein verzerrtes V / gerade Kanten in der Textur sind schräg im Puffer).

Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abstand messen im 3D-Raum
BeitragVerfasst: Di Jun 22, 2010 10:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Jedoch scheint es dass ich diese Werte nicht wirklich nutzen kann da sie (ich nehme mal an) durch die Perspektive verzerrt im Puffer liegen.

Nimm die Cursorposition und dazu den Z-Wert aus dem Z-Buffer und jage das durch gluUnProject. Die Cursor-Position muss natürlich relativ zum FBO sein...den hatten wir ja so gebaut das der Cursor bei (0,0) ist. Der Viewport sollte dabei von -1 bis 1 gehen, damit 0,0 auch wirklich die Mitte des FBO ist.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abstand messen im 3D-Raum
BeitragVerfasst: Di Jun 22, 2010 14:39 
Offline
DGL Member

Registriert: Mi Okt 21, 2009 14:02
Beiträge: 22
Meinst du dabei den Z-Buffer des FBO?
Wenn ja: Den lese ich mit dem obigen Code bereits aus, die Cursorposition ist dabei ja immer das Pixel bei N/N also genau in der Mitte. Jedoch muss die Cursorposition nicht immer genau auf der Kante sein um eine Kante auszuwählen. Als Ergebnis würde hier ja trotzdem ein Z=0 geliefert werden.
Deswegen wollte ich das Pixel auslesen von dem ich auch die Kanten-ID erhalte, gleiche Position aber halt im Z-Buffer. Hier ist aber wie gesagt das Problem dass die Werte im Buffer scheinbar schräg landen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abstand messen im 3D-Raum
BeitragVerfasst: Di Jun 22, 2010 14:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Hier ist aber wie gesagt das Problem dass die Werte im Buffer scheinbar schräg landen.

Öhm, das sollte eigentlich nicht passieren. Ich vermute du liest nicht aus dem Z-Buffer des FBO.

Es wäre möglich das man mit glReadPixels nicht aus einem FBO lesen kann. Es wäre auch möglich das du den Z-Buffer für den FBO auf eine bestimmte Art erstellen musst.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abstand messen im 3D-Raum
BeitragVerfasst: Di Jun 22, 2010 15:16 
Offline
DGL Member

Registriert: Mi Okt 21, 2009 14:02
Beiträge: 22
Hmm,
soweit ich jetzt mitbekommen habe liegt es an der Größe des Arrays in das gelesen wird. Während man die Textur mit einem array von [0..N*2,0..N*2] komplett auslesen kann, müssen für den Z-Buffer andere Dimensionen genommen werden, derzeit erhält man ein halbwegs brauchbare Ergebnis mit [0..N*2 - 1,0..N*2 - 1]. Da es jedoch nicht komplett fehlerfrei ist, würden mich die richtigen Dimensionen des Z-Buffers interessieren. Theoretisch gesehen lege ich doch mit
Code:
  glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, Range*2+1, Range*2+1);
ein (Range*2+1)/(Range*2+1) großes Array für den Buffer an und müsste ihn in den gleichen Dimensionen auslesen können.

Oder kann es gar sein, dass der angelegte Buffer (mDepthBuffer) nicht der ist, welchen ich mit ReadPixels auslese? (Und wenn, wie komme ich an diesen ran?)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abstand messen im 3D-Raum
BeitragVerfasst: Di Jun 22, 2010 15:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Oder kann es gar sein, dass der angelegte Buffer (mDepthBuffer) nicht der ist, welchen ich mit ReadPixels auslese? (Und wenn, wie komme ich an diesen ran?)

Lese mal meinen Post oben, du liest da irgendwelchen Datenmüll oder einen anderen Z-Buffer ;)
Der Z-Buffer ist genauso groß wie der FBO...jeder Pixel entspricht einem Wert im Z-Buffer an genau der gleichen Stelle, eine Verzerrung gibt es da nicht.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abstand messen im 3D-Raum
BeitragVerfasst: Di Jun 22, 2010 16:00 
Offline
DGL Member

Registriert: Mi Okt 21, 2009 14:02
Beiträge: 22
//Edit: Unfug


Zuletzt geändert von TheQaa am Mi Jun 23, 2010 08:32, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abstand messen im 3D-Raum
BeitragVerfasst: Mi Jun 23, 2010 08:32 
Offline
DGL Member

Registriert: Mi Okt 21, 2009 14:02
Beiträge: 22
Ok, ich habe den Fehler entdeckt:
Code:
glReadPixels(0,0,Range*2,Range*2,GL_DEPTH_COMPONENT,GL_FLOAT,@ZBuf);

lieferte stets den Zahlensalat, wobei mir aufgefallen ist dass stets ein Zeichen zu wenig "gelesen" wird. Wenn man sich dann noch überlegt was die Funktion glReadPixels überhaupt macht, hätte ich viel früher drauf kommen müssen :oops:
Code:
glReadPixels(0,0,Range*2+1,Range*2+1,GL_DEPTH_COMPONENT,GL_FLOAT,@ZBuf);

Ich habe vorher immer nur bis zum Range*2n Pixel gelesen aber dieses müsste man schon mit einlesen und dadurch kam diese Verzerrung zu stande :>


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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.008s | 15 Queries | GZIP : On ]