2012-07-05 4 views
7

Ho bisogno di scrivere sul buffer di profondità su un dispositivo Android (OpenGL ES 2.0). Poiché gl_FragDepth non è scrivibile con OGL ES 2.0, devo trovare una soluzione alternativa. In realtà voglio rendere le sfere tramite raycasting, in questo modo: http://www.sunsetlakesoftware.com/2011/05/08/enhancing-molecules-using-opengl-es-20. Tuttavia, la soluzione spiegata su questo sito Web (passaggio di rendering fuori schermo che scrive la profondità utilizzando uno speciale glBlendEquation) funziona solo su dispositivi Apple, non su Android, perché il GL_MIN_EXT -blending non è supportato.Soluzione per scrivere il buffer di profondità/valore di profondità in OpenGL ES 2.0

sul mio tablet Tegra3 sono stato in grado di implementare questo metodo: Android GLES20.glBlendEquation not working? (btw, mi consiglia di utilizzare valori di profondità linearizzate, danno risultati migliori!) funziona abbastanza bene, ma naturalmente questo è disponibile solo su GPU Nvidia.

In teoria, esiste l'estensione GL_EXT_frag_depth (vedere Can an OpenGL ES fragment shader change the depth value of a fragment?), ma non è disponibile anche sui dispositivi Android.

Infine, è possibile scrivere il buffer di profondità per una sola sfera (in un passaggio di rendering fuori campo), quindi scrivere il buffer di profondità per la sfera successiva in un secondo passaggio di rendering e combinare i due in un terzo passaggio di rendering. In tal modo, avresti 2 * n + 1 passaggi di rendering per n sfere - che sembra essere abbastanza inefficiente!

Quindi, dato che sono a corto di idee, la mia domanda è: riesci a pensare ad un altro modo generico/soluzione alternativa per scrivere il buffer di profondità su un dispositivo Android OpenGL ES 2.0?

risposta

2

Bene, sei sicuro di aver esaurito le opzioni qui. Non so di ulteriori soluzioni perché non conosco Opengl ES veramente bene.

L'unica cosa che mi viene in mente sarebbe che combina l'approccio multi-pass forza bruta con un po 'di pre-elaborazione:

Ordinare i sfere in gruppi in cui gli atomi non si sovrappongono l'un l'altro. Dovrebbe essere possibile ordinare tutte le sfere da proteine ​​in meno di dieci gruppi. Quindi visualizza tutte le sfere di ciascun gruppo in un unico passaggio. La vertice-profondità è sufficiente qui, perché le sfere non si sovrappongono. Quindi puoi "fondere in profondità" i risultati.

Ciò richiede una pre-elaborazione che potrebbe essere un problema.

+0

Questa sembra un'opzione interessante! Non è una soluzione elegante come avrei sperato, ma sembra che non ci sia nessun altro ... probabilmente farò un tentativo. L'ordinamento in profondità dovrebbe essere abbastanza veloce per la maggior parte delle proteine ​​e altre molecole più piccole. – kroneml