Question

OpenGL. Disons que j'ai dessiné une image, puis la seconde en utilisant XOR. Maintenant, j'ai un tampon noir avec des pixels non noirs quelque part, j'ai lu que je pouvais utiliser des shaders pour compter les noirs [rgb (0,0,0)] pixels sur le GPU?

J'ai aussi lu qu'il doit faire quelque chose avec OcclusionQuery. http://oss.sgi.com/projects/ogl- sample / registry / ARB / occlusion_query.txt

Est-ce possible et comment? [n'importe quel langage de programmation]

Si vous avez une autre idée sur la façon de trouver une similarité via OpenGL / GPU, ce serait formidable aussi.

Était-ce utile?

La solution

Je ne suis pas sûr de savoir comment vous utilisez le bit XOR (au moins, cela devrait être lent; je ne pense pas qu'aucun des GPU actuels accélère cela), mais voici mon idée:

  1. avoir deux images d'entrée
  2. activer la requête d'occlusion.
  3. dessine les deux images à l'écran (quad plein écran avec deux textures configurées), avec un fragment shader qui calcule abs (texel1-texel2) et supprime le pixel ( ignard dans GLSL ) si les pixels sont identiques (la différence est égale à zéro ou inférieure à un seuil). Le plus simple consiste probablement à utiliser un shader fragment GLSL. Là, il suffit de lire deux textures, calculer abs () de la différence et supprimer le pixel. Une connaissance de base du GLSL suffit ici.
  4. récupère le nombre de pixels ayant passé la requête. Pour les pixels identiques, la requête ne passera pas (les pixels seront ignorés par le shader), et pour les pixels différents, la requête passera.

Au début, j’ai pensé à une approche plus complexe qui implique un tampon en profondeur, mais j’ai alors réalisé que le simple fait de supprimer des pixels devrait suffire. Voici mon original cependant (mais le précédent est plus simple et plus efficace):

  1. avoir deux images d'entrée
  2. effacer l'écran et le tampon de profondeur
  3. dessine les deux images à l'écran (quad plein écran avec deux textures configurées), avec un fragment shader qui calcule abs (texel1-texel2) et supprime le pixel ( ignard dans GLSL ) si les pixels sont différents. Dessinez le quad afin que sa valeur de tampon de profondeur soit proche du plan proche.
  4. après cette étape, le tampon de profondeur contient de petites valeurs de profondeur pour les pixels identiques et de grandes valeurs de profondeur (dans le plan éloigné) pour des pixels différents.
  5. Activez la requête d'occlusion et dessinez un autre quad en plein écran avec une profondeur plus proche que le plan le plus éloigné, mais plus grande que le quad précédent.
  6. récupère le nombre de pixels ayant passé la requête. Pour les pixels identiques, la requête ne passera pas (le tampon de profondeur est déjà plus proche) et pour les pixels différents, la requête passera. Vous utiliseriez SAMPLES_PASSED_ARB pour l'obtenir. Vous trouverez un exemple de requête d'occlusion à l'adresse CodeSampler.com .

Bien entendu, tout cela nécessite un processeur graphique avec prise en charge des requêtes d’occlusion. La plupart des GPU depuis 2002 environ le supportent, à l'exception de certains bas de gamme (notamment Intel 915 (ou GMA 900) et Intel 945 (ou GMA 950)).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top