Domanda

OpenGL.Diciamo che ho disegnato un'immagine e poi la seconda usando XOR.Ora ho un buffer nero con pixel non neri da qualche parte, ho letto che posso usare gli shader per contare i pixel neri [rgb(0,0,0)] SULLA GPU?

Ho anche letto che ha a che fare con OcclusionQuery.http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt

È possibile e come?[qualsiasi linguaggio di programmazione]

Se hai altre idee su come trovare somiglianze tramite OpenGL/GPU, anche questo sarebbe fantastico.

È stato utile?

Soluzione

Non sono sicuro di come si esegue il bit XOR (almeno dovrebbe essere lento;Non penso che nessuna delle GPU attuali lo acceleri), ma ecco la mia idea:

  1. avere due immagini di input
  2. attiva la query di occlusione.
  3. disegna le due immagini sullo schermo (es.quad a schermo intero con due texture impostate), con uno shader di frammento che calcola abs (texel1-texel2) e uccide il pixel (scartare in GLSL) se i pixel lo sono lo stesso (la differenza è zero o inferiore a una certa soglia).La cosa più semplice probabilmente è semplicemente usare uno shader di frammenti GLSL, e lì devi semplicemente leggere due texture, calcolare abs() della differenza e scartare il pixel.Qui è sufficiente una conoscenza GLSL di base.
  4. ottenere il numero di pixel che hanno superato la query.Per pixel uguali, la query non passerà (i pixel verranno scartati dallo shader) e per pixel diversi, la query passerà.

All'inizio avevo pensato a un approccio più complesso che coinvolgesse il buffer di profondità, ma poi ho capito che uccidere i pixel sarebbe stato sufficiente.Ecco però il mio originale (ma quello sopra è più semplice ed efficiente):

  1. avere due immagini di input
  2. schermo chiaro e buffer di profondità
  3. disegna le due immagini sullo schermo (es.quad a schermo intero con due texture impostate), con uno shader di frammento che calcola abs (texel1-texel2) e uccide il pixel (scartare in GLSL) se i pixel sono diversi.Disegna il quad in modo che il valore del buffer di profondità sia vicino al piano vicino.
  4. dopo questo passaggio, il buffer di profondità conterrà valori di profondità piccoli per pixel uguali e valori di profondità grandi (piano lontano) per pixel diversi.
  5. attiva la query di occlusione e disegna un altro quad a schermo intero con una profondità più vicina al piano lontano, ma più grande del quad precedente.
  6. ottenere il numero di pixel che hanno superato la query.Per pixel uguali, la query non passerà (il buffer di profondità è già più vicino) e per pixel diversi, la query passerà.Utilizzeresti SAMPLES_PASSED_ARB per ottenere questo.C'è un esempio di query di occlusione su CodeSampler.com per iniziare.

Ovviamente tutto ciò richiede GPU con supporto per le query di occlusione.La maggior parte delle GPU dal 2002 circa lo supportano, ad eccezione di alcune di fascia bassa (in particolare, Intel 915 (aka GMA 900) e Intel 945 (aka GMA 950)).

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