Я пытаюсь нарисовать много кругов на сфере с помощью шейдеров. Базовый алогрит выглядит так:
- рассчитать расстояние от фрагмента (используя его координаты текстуры) до местоположения центра круга (центр круга также указывается в координатах текстуры)
- вычислить угол от фрагмента до центра круга.
- на основе угла получить доступ к текстуре (которая имеет 360 пикселей в ней, а красный канал определяет расстояние радиуса) и получить радиус для данного угла
- если расстояние от фрагмента до центра круга меньше полученного радиуса, то цвет фрагмента красный, в противном случае - синий.
Я хотел бы нарисовать ... скажем, 60 красных кругов на синей сфере. У меня есть шейдер y для работы с одним кругом, но как сделать 60? Вот что я пробовал до сих пор ....
Я передал текстуру данных, которая определяет радиус для заданного угла, но замечаю вкрапления артефактов. Я считаю, что это происходит из-за линейной интерполяции, когда я пытаюсь получить информацию из текстуры данных, используя:
float returnV = texture2D(angles, vec2(x, y)).r;
где angles - это текстура данных (Sampler2D), которая содержит радиус для данного угла, а x = angle / 360.0 (угол от 0 до 360) и y = от 0 до 60 (y - номер круга)
Я попытался передать Uniform float radius [360], но у меня нет доступа к радиусам с динамической индексацией. Я даже пробовал эту кашу ...
getArrayValue(int index) { if (index == 0) { return radii[0]; } else if (index == 1) { return radii[1]; }
и так далее ...
Если я создаю текстуру и помещаю все круги на эту текстуру, а затем смешиваю синюю сферу с сферой, содержащей круги, это работает, но, как и следовало ожидать, у меня действительно плохое сглаживание. Мне нравится идея процедурного создания кругов на основе положения фрагмента и положения круга из-за практически отсутствия наложения спектров. Тем не менее, я делаю руду, чем один?
Спасибо!!!
~ Болт