Страница 5 из 6

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 18 май 2016, 21:08
zameran
Апдейт.
Информация в шапке.
Скоро будут новые скриншоты, видео.
Кстати, стримы я устраиваю постоянно. По крайней мере пытаюсь. Каждые выходные.
Скрин газового гиганта:
Скрытый текст:

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 23 май 2016, 10:17
DDDENISSS
1) В какой структуре хранится планета? Я так понимаю просто карта высот?
2) Для физики ты используешь MeshCollider, а раньше, я так понял, использовал свою физику? Что заставило перейти на MeshCollider? Ведь он требует много памяти и на его создание уходит время.
Было бы лучше всего написать свою простую физику на GPU, чтобы можно было бы хранить данные только на GPU.
3) Какой буфер ты используешь для генерации меша? Я так понял Append ComputeBuffer для этого дела?
4) Как отработать случай, когда размера буфера не хватило? На сколько я помню в DX в этом случае неопределенное поведение.
5) После заполнения буфера, ты его перегоняешь в меш или рисуешь с помощью DrawProcedural \ DrawProceduralIndirect.

У меня слегка подобный проект https://youtu.be/yLSh94S8FH8?list=PLCBv ... FRGGDIwvJV
Но он пока использует только DX9.

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 23 май 2016, 11:08
zameran
DDDENISSS писал(а):1) В какой структуре хранится планета? Я так понимаю просто карта высот?
2) Для физики ты используешь MeshCollider, а раньше, я так понял, использовал свою физику? Что заставило перейти на MeshCollider? Ведь он требует много памяти и на его создание уходит время.
Было бы лучше всего написать свою простую физику на GPU, чтобы можно было бы хранить данные только на GPU.
3) Какой буфер ты используешь для генерации меша? Я так понял Append ComputeBuffer для этого дела?
4) Как отработать случай, когда размера буфера не хватило? На сколько я помню в DX в этом случае неопределенное поведение.
5) После заполнения буфера, ты его перегоняешь в меш или рисуешь с помощью DrawProcedural \ DrawProceduralIndirect.

У меня слегка подобный проект https://youtu.be/yLSh94S8FH8?list=PLCBv ... FRGGDIwvJV
Но он пока использует только DX9.


1) Структура очень проста - параметры для генерации, основные параметры планеты (Радиус, наличие атмосферы и тп). В купе это всё влазит в .json файл, приемлемого размера даже для передачи по сети.
2) Свою физику я не использовал. Только не давно начал экспериментировать с MeshCollider. Да, просаживает он при создании сильно.
3) Дело в том, что на данном этапе используются стандартные буфферы. Загоняются данные - результат считается в буффер - очистка не нужных буфферов - рисование. Буффер необходимый для рисования лежит в памяти. В шейдере просто двигаю вершины. Очень заинтересован в использовании DrawProcedural, но я просто не понимаю как с ним работать... Это отдельный вопрос.
4) Размер буффера для квада - константа равная размеру квада в вершинах по стороне в квадрате.
5) ComputeShader срабатывает 1 раз. При определённых условиях. Дальше всё как в п.3.

Я уверен, вполне себе можно запускать Kernel из ComputeShader, так, что бы не было "простоя" рендера.
На данном этапе это решено ожиданием после запуска в 8 кадров (регулируется). Даёт не плохой результат. Но чёрт побери - велосипедище.

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 23 май 2016, 12:33
DDDENISSS
Очень заинтересован в использовании DrawProcedural, но я просто не понимаю как с ним работать...

Очень просто.
public static void DrawProcedural(MeshTopology topology, int vertexCount, int instanceCount = 1);
Передаешь тип геометрии, количество вершин, инстансов (если, допустим, надо нарисовать с разными позициями).

Синтаксис:
Используется csharp
    void OnRenderObject() {
        material.SetPass( 0 );
        Graphics.DrawProcedural( topology, buffer.count );
    }
 


А в вершинном или геометрическом шейдере просто получаешь номер вершины и инстанса, и из этих данных как хочешь генерируешь вершину или геометрию.

Синтаксис:
Используется javascript
                        v2f vert(uint id : SV_VertexID) {
                            Vert IN = _Buffer[id];
                            v2f v;
                                v.pos = mul(UNITY_MATRIX_MVP, float4(IN.pos, 1));
                                v.normal = IN.normal;
                                return v;
                        }
 



Давно мечтаю заюзать это для моего MineCraft. Но останавливает то, что самому придется заниматься куллингом и сортировкой.

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 23 май 2016, 14:40
zameran
DDDENISSS писал(а):
Очень заинтересован в использовании DrawProcedural, но я просто не понимаю как с ним работать...

Очень просто.
public static void DrawProcedural(MeshTopology topology, int vertexCount, int instanceCount = 1);
Передаешь тип геометрии, количество вершин, инстансов (если, допустим, надо нарисовать с разными позициями).

Синтаксис:
Используется csharp
    void OnRenderObject() {
        material.SetPass( 0 );
        Graphics.DrawProcedural( topology, buffer.count );
    }
 


А в вершинном или геометрическом шейдере просто получаешь номер вершины и инстанса, и из этих данных как хочешь генерируешь вершину или геометрию.

Синтаксис:
Используется javascript
                        v2f vert(uint id : SV_VertexID) {
                            Vert IN = _Buffer[id];
                            v2f v;
                                v.pos = mul(UNITY_MATRIX_MVP, float4(IN.pos, 1));
                                v.normal = IN.normal;
                                return v;
                        }
 



Давно мечтаю заюзать это для моего MineCraft. Но останавливает то, что самому придется заниматься куллингом и сортировкой.


Спасибо. Да, я примерно так и делал. Но в основном остановила "неизведанность" данного океана.
Куллинг нужен собственный, да.
А вот с сортировкой я вообще не знаю что делать.

Поэтому рисую так, как было описано выше.

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 03 июн 2016, 12:43
zameran
Апдейт! Информация в шапке.
Когда доделаю масштабируемость и систему кластеров запишу видео полёта по планетарной системе.

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 03 июн 2016, 13:58
Woolf
Апдейт! Информация в шапке.

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

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 03 июн 2016, 15:36
zameran
Woolf писал(а):
Апдейт! Информация в шапке.

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


Окей. Буду дублировать.

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 05 июн 2016, 11:22
zameran
Странная штуковина произошла, когда я переместил "важные" запчасти из вершинного в фрагментный Quad шейдера.
Nvidia GTX 980 GPU загружается на 99%, всегда, но при этом рендер выдаёт более 500-700 кадров, а у поверхности не падает ниже 250-300. К тому же такой спад больше вина нагрузки на процессор...
Причём я точно вычислил, что это происходит именно из за Quad шейдера, в фрагментной подпрограмме которого много всего... не так уж и много...
У меня есть предположение, что юнька сама забивает GPU - как бы резервирует. Но это маловероятно.
VSync не пробовал. Тесты продолжаются :D

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 05 июн 2016, 11:59
bwolf88
А это на каком разрешении фрагментный быстрее. может на FullHD будет обратная разница ?

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 05 июн 2016, 16:14
zameran
bwolf88 писал(а):А это на каком разрешении фрагментный быстрее. может на FullHD будет обратная разница ?


Как раз таки чем ниже разрешение, тем меньше GPU напрягается в моём случае. Я проводил тесты и бенчмарки на своей поделке.
Я пришёл пока к выводу, что раз фреймрейт такой высокий, значит GPU рендерит такое больше кол-во кадров - вот и грузится.

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 05 июн 2016, 17:08
bwolf88
Как раз таки чем ниже разрешение, тем меньше GPU напрягается в моём случае.

Оно и понятно. Я к тому, что вертексной обработке пофигу какое разрешение, а фрагментная от него как раз будет зависеть.

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 14 июн 2016, 23:45
zameran
Апдейт. Летом темпы чуточку угаснут.
Вполне вероятно, что этот проект перерастёт в экономическую MMO. Но это не точно. ;)

Скрытый текст:
Middle June 2016
- Рефактор. Чуточку.
- Условия для деления на уровни LOD изменены, и теперь имеют два режима:

  • От ближайшего угла по сферезированным координатам угла квада без учёта высоты в этой точке. (Старый)
  • От ближайшего угла по верхней плоскости AABB.
- Улучшена отзывчивость LOD системы.
- Улучшена упаковка multi_compile переменных в шейдеры.
- Улучшено поведение и отображение линз.
- Уменьшено количество генерируемого мусора за 1 кадр.
- Все ожидания кадров, ожидание некоторого времени и тп. в корутинах заменены на использование кешированных.
- Работа над атмосферами.
- Рассеянный свет/отблеск от соседней планеты на атмосфере, если таковая имеется. (Ещё в разработке, но уже рядом).
- Буфферы для квада устанавливаются только 1 раз - после генерации.
- Отдельный класс для AABB квада, содержащий вершины "коробки".
- Модификатор силы затмений на поверхности вынесен. Теперь это шейдерный параметр.
- В связи с переходом на использование MaterialPropertyBlock, теперь когда фокус переходит на окно с приложением планета перестраивается. Возможно это будет решено в ближайшее время.
- Расширение API планет и квадов.
- Фикс магической формулы для LOD. Она давала неверные результаты, если радиус планеты не целое число.
- И другие маленькие фиксы.
- И переход на версию движка 5.3.5f1.

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 15 июн 2016, 02:45
bwolf88
Дружище, будет вообще суперклассно если к каждому апдейту ты будешь прикреплять хотя бы минутное видео, демонстрирующее наглядные изменения. Так можно оценить визуальную составляющую и прогресс. Ну а если еще и с озвучкой, то будет прям божественно ;;).

Re: SpaceW - Procedural Planet Renderer

СообщениеДобавлено: 15 июн 2016, 19:39
KelZard
Мы делаем космическую игру https://new.vk.com/dmatternet, если что то можно скооперироваться