2010-04-13 5 views
1

J'ai deux textures générées à l'aide d'un fragment shader. Je veux être en mesure de compter le nombre de texels dans chaque texture qui sont au-dessus de l'intensité de la couleur. Ma question est de savoir comment cela peut-il être fait? Ma première pensée est de compter ces texels en utilisant le fragment shader avant de générer la texture. Cependant, cela nécessiterait une sorte de compteur global. Je ne peux pas utiliser les requêtes d'occlusion car les textures sont créées à partir d'autres textures. J'utilise OpenGL 2.1. Toutes les idées ont apprécié.
MerciComptage de texels à l'aide d'un fragment shader

Répondre

2

Merci pour les idées,
J'ai trouvé un moyen simple, je pense est le plus efficace. J'ai d'abord pensé que les requêtes d'occlusion ne pouvaient être utilisées qu'avec la géométrie, mais elles peuvent aussi être utilisées avec des textures.

  1. Allumez l'occlusion des requêtes
  2. Render l'image en utilisant un fragment shader et discard texels ci-dessous nécessaire l'intensité des couleurs
  3. permet de récupérer le nombre de texels test du dessin passant de requête
+0

Est-ce que cela fonctionne vraiment? Le doc semble très clair que "se défausser" n'est pas pertinent "https: //www.opengl.org/wiki/Query_Object # Occlusion_queries –

+0

Ça a vraiment marché il y a 5 ans! – Brett

+0

Il semble que ça fonctionne encore. Alors peut-être que le document est juste confus/confus. –

0

Vous pouvez toujours exécuter un pixel shader sur le framebuffer qui définit tous les pixels au-dessus du seuil à blanc et le reste à noir. Ensuite, prenez une photo du framebuffer et comptez le nombre de pixels blancs ...

Je présume que vous n'allez pas avoir besoin de faire cela à chaque image. Si vous êtes, vous devrez probablement changer vos exigences ...

+0

Oui, cela doit être fait chaque trame. Eh bien, environ 500 fois par 30fps. – Brett

+0

Je viens de trouver ce http://stackoverflow.com/questions/99906/count-image-similarity-on-gpu-opengl-occlusionquery, qui est à peu près ce que j'essaie d'atteindre. Je veux compter la similitude entre les images. Quelqu'un a-t-il connaissance de cette technique? Est-ce que ça marche? – Brett

0

J'ai fait cela en utilisant un vertex et fragment shader.

Je déclare un sommet de point pour chaque pixel de la texture et les restitue.

Je déclare une texture de rendu hors écran de 1D et correspond à la longueur du nombre de compartiments que je souhaite. Vous pourriez faire ce 1 seau mais cela vous ralentira pendant que chaque fragment attend d'écrire sur le même pixel. J'ai trouvé 32 fonctionne généralement assez bien pour moi.

Définissez le mode de fusion sur additif.

Dans le vertex shader, je mod gl_VertexID par le nombre de buckets et défini entre -1 < -> 1.

Testez la texture pour chaque sommet (qui est vraiment égal à chaque pixel) et réglez gl_Color sur blanc pour un pixel valide et noir pour non (essentiellement 1 ou 0).

Effectuez une relecture sur la texture 1D et additionnez les valeurs. Ce sera le nombre de pixels. Une deuxième manière que j'ai fait dans le passé est de faire le premier passage à une texture hors écran qui est la même taille que l'entrée et classer l'entrée comme 1 ou 0. Ensuite, rendre à une texture qui est la moitié de la largeur et la hauteur et l'échantillon 4 fois ajouter et écrire. Continuez à faire cela jusqu'à ce que vous arriviez à un 1x1 et relisez la valeur.

Questions connexes