0 votes

Comptage des texels à l'aide d'un fragment shader

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

1voto

Brett Points 946

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

  1. Activer les requêtes d'occultation
  2. Rendre l'image en utilisant un shader de fragment et discard les texels en dessous de l'intensité de couleur requise
  3. Récupérer le nombre de texels passant le test de dessin à partir de la requête

0voto

Mikepote Points 798

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

Je suppose que vous n'aurez pas besoin de le faire à chaque image. Si c'est le cas, vous devrez probablement modifier vos exigences...

0voto

Jose Points 301

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

Je déclare un point vertex pour chaque pixel dans la texture et les rendent.

Je déclare une texture de rendu déconnectée qui est en 1D et a une longueur égale au nombre de compartiments souhaités. Vous pourriez en faire un seul, mais cela ralentira pendant que chaque fragment attend d'écrire sur le même pixel. J'ai trouvé que 32 fonctionne généralement assez bien pour moi.

Configurer le mode de fusion en additif.

Dans le vertex shader, je module gl_VertexID par le nombre de compartiments et définis cette plage entre -1<->1.

Echantillonner la texture pour chaque vertex (qui est vraiment égal à chaque pixel) et définir la gl_Color en blanc pour un pixel valide et en noir pour un pixel invalide (essentiellement 1 ou 0).

Faites une lecture sur la texture 1D et additionnez les valeurs.Cela donnera le nombre de pixels.

Une autre méthode que j'ai utilisée par le passé est de faire un premier passage vers une texture déconnectée de la même taille que l'entrée et de classer l'entrée comme 1 ou 0. Ensuite, rendre vers une texture qui est la moitié de la largeur et de la hauteur et échantillonner 4 fois, ajouter et écrire. Continuez à le faire jusqu'à ce que vous arriviez à un 1x1 et lisez la valeur revenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X