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

[Unity3D] Делаю свой фреймворк для рисования линий.

Страницы: 1 2 3 4 5 6 Следующая »
#0
(Правка: 5 янв. 2019, 19:47) 18:36, 3 янв. 2019

Я решил запилить свой фреймворк для рисования линий в Юнити.
Я тут расскажу о своем ходе мыслей , а вы покритикуйте если что-то можно  сделать лучше.
Вобщем я решил делать враппер для стандатного LineRenderer , потому что он быстрый. Я не знаю как он там внутри устроен , но он быстрый, очень быстрый.
Из минусов - один лайн рендерер может рисовать только одну непрерывную линию. 
Для такой , например , фигуры потребовалось бы сотня лайн рендеров в сцене, что не прикольно совсем.
Изображение
Я сделал прерывания линий через расстановку ключей толщины линии. Это - один LineRenderer и один DrawCall соотвественно. То есть она не прерывается, а утоньшается до нуля в местах перехода на следующую линию. Из минусов такого способа главный это то что приходтся создавать AnimationCurve и назначать ее лайн рендеру, а создание нового обьекта это выделение памяти со всеми вытекающими.

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

Кто на эту тему что нибудь копал, может какие то готовые ассеты смотрел?  Vectrosity например, популярен - но он полностью на cpu стороне все делает. По этому там несколько тысяч точек - и до свидания fps , не вариант , вобщем. 


#1
3:25, 4 янв. 2019

LineRenderer генерит меш. Генерь его сам. Будет один MesFilter + MeshRenderer

Пример: https://docs.unity3d.com/Manual/Example-CreatingaBillboardPlane.html

#2
8:38, 4 янв. 2019

Durane
я же написал, что использую LR потому что он быстрый сам по себе.  Генерация меша будет намного медленней. И еще есть вопросы по камерам - к какой камере ориентировать. В LR эти вопросы уже решены

#3
(Правка: 13:05) 13:04, 4 янв. 2019

1) генерить меш. с небольшим числом вершин не накладно
2) передавать в шейдер буффер с аттрибутами 1 в 1 вторым стримом (умеет юнити это хавать или нет хз, но технология базовая). VertexID не нужны
3) генерить все на лету через GeometryShader (привет ограничения)

#4
14:46, 4 янв. 2019

Mira
геометрические шейдеры работают на webGL?
У меня такое чувство что я один на webGL ориентируюсь, все остальные только для dx12 разрабатывают

#5
16:29, 4 янв. 2019

Polyflow3d
> геометрические шейдеры работают на webGL?
ноу

#6
20:11, 4 янв. 2019

Polyflow3d
LineRenderer тоже генерит геометрию :)

#7
20:38, 4 янв. 2019

Durane

LineRenderer тоже генерит геометрию :)

не может быть!
ты такой эксперт!

#8
(Правка: 23:00) 22:41, 4 янв. 2019

Polyflow3d
> И еще есть вопросы по камерам - к какой камере ориентировать.
Через вершинный шейдер этот вопрос решается. Нужно только количество вершин передать соответствующее заполненное, вершины по парно по направлению линии без толщины, нормали как +- биссектриса или плоскость вращения, толщина и ориентация считается в вершинном шейдере.

Берешь для каждой вершины направление на камеру (objectview) и этот вектор поворачиваешь соответственно плоскости, которая задана нормалью, на 90 градусов или векторным умножением. Добавляешь это к вершине умножая на толщину, получаешь то что требуется.

#9
11:03, 5 янв. 2019

foxes

вершины по парно по направлению линии без толщины,

и как найти пару если vertex ID не поддерживается?

#10
(Правка: 16:08) 15:26, 5 янв. 2019

Polyflow3d
> и как найти пару если vertex ID не поддерживается?
Для чего тебе искать пару? Все необходимое я уже описал выше. Или я где то написал про поиск пары?

#11
17:48, 5 янв. 2019

foxes

то есть ты предлагаешь для всех вертексов на cpu посчитать нормаль ? А в gpu лишь раздвигать их на заданную толщину? А ты кстати знаешь, что юнити нормирует все нормали в шейдере? Я не проводил детального расследавания на счет фрагментных шейдеров, но surface - точно.

#12
(Правка: 19:23) 19:03, 5 янв. 2019

Оооох... Все можешь больше не Ванговать.

Вот тебе щейдер

+ Показать

Вот тебе мега сложный расчет нормалей на CPU

+ Показать

PolarGrid

+ Показать

Результат

+ Показать

не знаю в чем проблема передать толщину каждого деления через UV если сильно потребуется.

#13
(Правка: 19:45) 19:41, 5 янв. 2019

foxes

не знаю в чем проблема передать толщину каждого деления через UV если сильно потребуется.

Ну перечитай еще раз то что я написал - ты в нормаль не запихнешь толщину линии, потому что она (нормаль) на каком то этапе нормализуется. 
Потребуется или нет - странный вопрос, конечно.
Если ты тут только хочешь всем показать что ты умеешь генерить меш колбаски, то может и не потребуется,
а для реальных задач - маст хев.
Можно, конечно, запихнуть в юв2  данные о толщине , только после этого нарисуй сто таких обьектов Лайн Рендером и сто раз скриптом и сравни производительность. 
Кстати не забывай, что в лайн рендере генерится пропорциональный длине отрезка UV, скругленные углы  и концы.
Когда ты все это скриптом реализуешь производительность тебя неприятно удивит.
Тут об этом речь идет, вообще-то. О производительности.

#14
19:42, 5 янв. 2019

foxes

Оооох... Все можешь больше не Ванговать.

ты о чем?

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