Войти
ПрограммированиеФорумГрафика

Звездное небо

Страницы: 1 2 Следующая »
#0
10:19, 23 июня 2021

Решил сделать отдельную тему, как с дневным небом есть существенные различия.

Для себя выделил три способа:

1. Натянуть текстуру на халфскайсферу.
2. Сделать звезды процедурно, как на ShaderToy делают.
3. Тупо накидать спрайтов.

1. Главные сложности - не так просто натянуть текстуру на сферу так чтобы изображение у полюсов было правильное. Живого софта я под это дело не нашел, текстур не нагуглил.
Сначала натянул блендером на целую сферу текстуру 2048x1024 и ужаснулся результату - все адски мутное. Потом сделал полусферу и натянул текстуру 8192x2048 и это уже стало вполне приемлимым по качеству. Но рисовать звезды на текстуре придется вручную прямо в том же блендере.
2. Есть красивые эффекты, но они тормозят. Так что такое себе.
3. Еще не пробовал, но должно получится достаточно шустро и можно будет сделать разные динамические эффекты.

Я так понял почти везде используется первый способ.


#1
10:23, 23 июня 2021

Если не планируешь делать туманности, то можно спрайтами звезды отрисовать, а то хранить кубемапу большого разрешения это дорого.
Для кубемап есть вариант создать теселированный куб с тангенциальной проекцией, чтоб минимум искажений было.

#2
12:03, 23 июня 2021

MikeNew
на кубмапу нужно что-то невысоко разрешения, типа туманность мутная, а звезды сделать спрайтами-билбордами.

#3
12:16, 23 июня 2021

Еще вариант - использовать текстуру невысокого разрешения, но пиксельным шейдером добавить четкости (а чтоб не было совсем "лестнично" - использовать функцию гладкой ступеньки).

#4
12:31, 23 июня 2021

MikeNew
Нужно накидать рандомных точек на сферу или шар одной из следующих функций из ATAlib

// random sphere radius 1 point
inline vec3f rsp() { float z=rnd(-1,1);return vec3f(rcp(sqrt(1.-z*z)),z); }
// random sphere radius R point
inline vec3f rsp(float r) { float z=rnd(-r,r);return vec3f(rcp(sqrt((r-z)*(r+z))),z); }
// random ball radius 1 point (dens~r^2 => r^3 eq distr in [0,1], 0^3=0, 1^3=1
inline vec3f rbp() { return rsp(pow(rnd(),1.f/3)); }
// random ball radius R point
inline vec3f rbp(float r) { return rsp(r*pow(rnd(),1.f/3)); }
#5
18:26, 23 июня 2021

Aslan
> Нужно накидать рандомных точек на сферу или шар

Если речь о земном небе, то реальные параметры звезд (склонение и прямое восхождение, а также видимая звездная величина и цвет/температура) можно взять из Bright Star Catalog (звезды, видимые невооруженным взглядом), например, отсюда

ftp://cdsarc.u-strasbg.fr/pub/cats/V/50

Их там порядка девяти тысяч, не так уж и много.

#6
(Правка: 24 июня 2021, 10:33) 20:41, 23 июня 2021

MikeNew
> сделал полусферу и натянул текстуру 8192x2048 и это уже стало вполне приемлимым по качеству.
Ты оборачиваешь текстуру вокруг полюса сферы? Так конечно будут искажения, лучше использовать так называемую сферическую текстуру, меньше искажений и текстура квадратная.

#7
(Правка: 11:01) 11:01, 24 июня 2021

Mikle
> Ты оборачиваешь текстуру вокруг полюса сферы? Так конечно будут искажения,
> лучше использовать так называемую сферическую текстуру, меньше искажений и
> текстура квадратная.
Не так просто сделать сферическую текстуру.
Я оборачиваю полусферу блендером с помощью Enviroment Texture.

#8
11:25, 24 июня 2021

MikeNew
> Не так просто сделать сферическую текстуру.
Сделать саму текстуру, или расставить на сфере координаты? В чём сложность?

#9
11:34, 24 июня 2021

Mikle
> В чём сложность?
В том, что круги превращаются в элипсы, если неправильно натягивать текстуру

#10
11:45, 24 июня 2021

/A\
При оборачивании текстуры вокруг полюса тоже превращаются, причём гораздо сильнее. Вопрос был в чём сложность применения именно сферической текстуры.

#11
11:58, 24 июня 2021

Mikle
> Сделать саму текстуру, или расставить на сфере координаты? В чём сложность?
Сделать саму текстуру.. да и второе тоже. Искажения и так и так будут, хз как идеально натянуть на сферу.

#12
(Правка: 13:14) 12:24, 28 июня 2021

MikeNew
> хз как идеально натянуть на сферу.
Чем обычный скайбокс не подходит? Или проблемы с репроекцией?
На самом деле те же эффекты из shadertoy, как туманность, можно легко сгенерить в кубмапу на процессоре и сохранить ее для дальнейшего использования.
Я кстати звезды делал спрайтами, очень просто и можно за один дравколл все звезды накидать.

Здесь заранее сгенеренный скайбокс из shadertoy, и на нем же точки.
Тут я только звезды отреднерил спрайтами.

Можно две полусферы как две разные текстуры натянуть, а по горизонту их смиксовать - это дает самые минимальные искажения если считать через градусы=пиксели (верхнее нижнее полушарие, не развертка меркатора). Но это все равно костыль.

#13
12:29, 29 июня 2021

foxes
> Чем обычный скайбокс не подходит? Или проблемы с репроекцией?
Тем что от обычного скайбокса я в принципе отказался в пользу полусферы, из-за проблем с репроекцией тоже.
foxes
> Я кстати звезды делал спрайтами, очень просто и можно за один дравколл все
> звезды накидать.
Тоже так планирую попробовать и сравнить что быстрее - спрайтами или из текстуры.

#14
12:39, 29 июня 2021

MikeNew
3 накидать спрайтов самый простой и быстрый, если звезд не миллион

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика