Domanda

Per quanto ne so, non possiamo leggere il valore Z (profondità) in OpenGL ES 2.0.Quindi mi chiedo come possiamo ottenere le coordinate del mondo 3D da un punto sullo schermo 2D?

In realtà ho alcuni pensieri casuali che potrebbero funzionare.Dato che possiamo leggere il valore RGBA utilizzando glReadPixels, che ne dici di duplicare il buffer di profondità e memorizzarlo in un buffer di colore (ad esempio ColorforDepth).Naturalmente è necessario che ci siano delle convenzioni interessanti in modo da non perdere alcuna informazione del buffer di profondità.E poi, quando abbiamo bisogno delle coordinate globali di un punto, alleghiamo questo buffer di colore ColorforDepth al framebuffer e quindi lo rendiamo.Quindi, quando utilizziamo glReadPixels per leggere le informazioni di profondità in questo frame.

Tuttavia, ciò porterà a un flash di 1 fotogramma poiché il colorbuffer è uno strano buffer tradotto dal buffer di profondità.Mi sto ancora chiedendo se esiste un modo standard per ottenere la profondità in OpenGL es 2.0?

Grazie in anticipo!:)

È stato utile?

Soluzione

Utilizzando un FBO, puoi eseguire il rendering senza visualizzare i risultati.Se utilizzi ES 2.0, il tuo shader di frammento può accedere alla profondità del frammento corrente (nelle coordinate della finestra) come parte di gl_FragCoord, quindi puoi scriverlo nel buffer del colore, utilizzare glReadPixels per ottenere il risultato e procedere.In alternativa, puoi caricare world-space z come variante e scriverlo dal tuo shader di frammento, nel caso sia un modo più semplice per aggirare.

Per convincerti, prova a scrivere uno shader veloce che metta in evidenza gl_FragCoord.z ​​frettolosamente con bassa precisione, ad es.Appena

gl_FragColor = vec4(vec3(gl_FragCoord.z), 1.0);

Dovresti ottenere una scala di grigi con l'intensità del colore che rappresenta la profondità.Poiché ti trovi nelle coordinate della finestra, l'intensità varierà da 0,0 (frammento non ritagliato più vicino possibile) a 1,0 (frammento non ritagliato più lontano possibile).Per non perdere molta precisione, probabilmente è più utile dividere il valore tra i componenti, poiché quasi certamente il tuo fornitore non supporta i buffer di destinazione in virgola mobile.

Altri suggerimenti

Io uso un raggio di base casting per la scelta di un oggetto 3D da un touch screen. In realtà ho calcolare l'intersezione tra lo schermo normale al punto di contatto e di una sfera che contiene il mio oggetto. Per una raccolta molto precisa o forma complicata è necessario utilizzare diversi sfera.

Si può anche proiettare alcuni punti chiave di voi oggetto nello spazio 2D di voi schermo (la mia moltiplicando il punto 3D per il vostro matrice di trasformazione) e poi fare qualche confronto 2D (a distanza) con tocchi punto.

Vorrei anche essere in grado di leggere i valori nel buffer di profondità, ma la ricerca indica che non può essere fatto.

come suggerisce vincent, se si dispone di forme semplici come sfere, ray-casting è probabilmente migliore.

per le forme più complesse Tho, Sto pensando di rendere l'oggetto in una (potenzialmente più piccolo) fuori campo del buffer, assegnare manualmente una delle componenti di colore di ogni vertice sia la profondità di tale vertice, e poi la lettura dei valori di colore. questo è un po 'poco elegante e tho fastidioso, e richiede di essere in grado di convertire oggetto-spazio per lo spazio dello schermo (sto usando i miei quaternioni per guidare le matrici, in modo che si prende cura di questo). ci può essere un modo con shader per scrivere le informazioni di profondità nel colore o stencil buffer (non GL ES nemmeno uno stencil buffer?)

se qualcuno ha un approccio più pulito Mi piacerebbe sentirla.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top