Трудно сделать результат точно таким, каким вы хотите его видеть, поскольку вам нужно знать для каждого пикселя , сколько фрагментов было.
Если вам достаточно, чтобы частицы выглядели нормально, этого должно быть достаточно, чтобы изменить режим смешивания.
Они накапливаются в белом, потому что вы, вероятно, используете аддитивное смешивание альфа:
result = source_color*source_alpha + destination_color
Или смешивание простых добавок:
result = source_color + destination_color
(где источник - «цвет данного фрагмента», а пункт назначения - «то, что уже было в кадровом буфере в этом месте»).
Оба из них распадаются на белый с большим количеством "слоев". Но вы можете использовать «истинное» альфа-смешение:
result = source_color * source_alpha + destination_color * (1-source_alpha)
, который не распадется на белый.
В OpenGL это соответствует:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Это не совсем то, что вы хотели, так как результат будет зависеть от порядка, но он должен быть на 100% достаточным для системы частиц. Надеюсь, это поможет.
(Также не забудьте визуализировать геометрию твердого тела перед частицами и отключить z-запись.)