Угу. Я посмотрел уже сам еще несколько сообщений назад, потому и предложил вариант, что это такая хитрая комбинация освещения и дизеринга.
Я к сожалению прям так ничего другого придумать не могу. Вот моя попытка набросать алгоритм, который рисует похожий шарик:
https://jsfiddle.net/d96bbot4/6/
Беру точку x, y.
Если x*x + y*y < 1, значит это годная точка внутри окружности.
У меня сфера x*x + y*y + z*z = 1, значит z*z = 1 - x*x - y*y
Вектор на лампочку у меня [1 0 0]
Все векторы нормированы, поэтому яркость = cos(фи) = a•b = x * const
Дизеринг: беру еще одно случайное число и если яркость больше, точку ставлю, иначе нет.
Пока лампочка в [1 0 0], z вообще не нужно получается (можно раскомментировать код для любых векторов). Но это как-то не очень красиво. Надо придумать как точки сгущать ближе к краю проекции сферы.