Cuente píxeles por color en el sombreador de fragmentos webgl

Tengo 2d textura S y quiero devolver 3d textura H, de modo que el píxel H [r, g, b] sea igual al número de píxeles de color rgb en la textura S. Básicamente histograma de colores en la textura S.

Sé sobre consultas de oclusión, pero solo está disponible en webgl2, y IIUC incluso allí solo con resultados booleanos, y además tendría que hacer una consulta por separado para cada color. Idealmente, me gustaría hacer esto en un fragmento de sombreado. ¿Hay alguna manera de hacer operaciones de reducción (plegado) en sombreadores de fragmentos?

Por qué necesito esto (si estás interesado):

Estoy tratando de hacer una detección de colisión 2D perfecta de píxeles entre objetos y terreno estático en sombreadores de fragmentos webgl.

El plan es utilizar el truco de los viejos tiempos: dibujar un sprite 4 veces, movido por (0,0), (0, dy), (dx, 0) y (dx, dy) píxeles, y contar los píxeles de sprite que choca con el terreno cada vez, a partir de eso puedo calcular el vector (nx, ny) que representa la dirección en que el objeto debe moverse para rebotar en el terreno lo más rápido posible. Simplemente agregando ese vector a la velocidad del objeto hace que el objeto se deslice muy bien a lo largo del terreno (cuesta abajo, saltando sobre los baches, etc.). Lo he usado en el viejo juego de C ++ y eso funciona muy bien, pero es demasiado lento en js.

Quiero dibujar todo el búfer de vértices de todos los sprites en el juego (cada uno en un color diferente para poder reconocer qué objetos colisionan) 4 veces, cada vez dibujando el terreno negro sobre ellos, y luego contar los píxeles de cada color en el resultado 4 framebuffers.

El problema es: ¿cómo contar los píxeles en fragment shader?

Respuestas a la pregunta(1)

Su respuesta a la pregunta