Войти
UnityФорумПрограммирование

Unity3D: возможно ли менять запеченную текстуру теней в Runtime? (4 стр)

Страницы: 13 4 5 68 Следующая »
#45
(Правка: 3:48) 3:22, 24 мая 2020

Alerr

> Мы ищем ближашие вертексы (массив colors) и красим их. Потом все color вертексов присваиваем обратно модели.
такого я в статье не обнаружил) по моему там все делается совсем иначе.


Во избежание путаницы в обсуждении попробую структурировать накопившиеся данные.

Задача (частный случай вашей): мы хотим иметь текстуру, в которую заносим инфу о чирках мечом по полу, чтобы потом при помощи этой текстуры рендерить пол со следами меча.

Аспект того, что именно рисуется на текстуре и что в итоге рисуется на экране

Вариант 1.

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

Плюсы:
- форму следа легко сделать какой угодно

Минусы:
- если надо красиво, то нужна большая текстура. если надо красиво на большой сцене - нужна просто гигантская текстура.

Вариант 2.

можно рендерить на текстуре только абстрактную простую линию, а всю красоту наводить в процессе рендеринга на экран. Так в данном аспекте предлагаю сделать я.

Плюсы:
- при том же качестве итоговой картинки и размере сцены потребуется гораздо меньшая текстура.

Минусы:
- реализация вывода красивого следа на основании простой линии низкого разрешения алгоритмически нетривиальна.

Аспект того, каким способом вносить изменения в текстуру, где хранятся следы (вне зависимости от варианта выбранного в прошлом аспекте)

Вариант 1.

вносить изменения в инстанс текстуры на стороне C# и делать Apply.
Плюсы:
- очень просто
Минусы:
- при каждом изменении происходит передача на GPU всей текстуры

Вариант 2.

вносить изменения в инстанс текстуры, используя технику "рендеринга в текстуру". Именно это происходит в статье и как мне кажется вам тоже следует придерживаться этого варианта. И именно это я назвал "посыланием команды".
Плюсы:
- довольно просто
- текстура целиком отправляется на GPU лишь единожны. далее мы только отправляем на GPU только маленькие изменения текстуры.
Минусы:
- чуть сложнее чем вариант 1.


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


#46
(Правка: 4:23) 3:33, 24 мая 2020

Alerr
Дополнительные вопросы
1. каков у вас в игре размер уровня в квадратных метрах?
2. какова максимально допустимая толщина (ширина) следа (одинарной линии) на полу в стантиметрах по задумке того, кто в игре отвечает за визуальную часть?
3. какова сложность пола? (лучше скрином на похожую игру)
4. насколько произвольно игрок может махать мечом в игре? сможет ли игрок рисовать мечом на полу как фломастером, или все удары мечом - резкие взмахи, т.е. следы на полу будут всегда прямыми или дугообразными черточками?
5. насколько свободно игрок выбирает траекторию удара? игра от первого лица с произвольной наводкой мышью или же это слешер с управлением фехтованием типа как в Dark Souls или в Devil May Cry?

#47
(Правка: 4:57) 4:54, 24 мая 2020

Alerr
еще к слову о квадратности

Вот у нас есть довольно лоурезная маска следа от меча 16х16:

+ Показать

Вот как выглядит простое заполнение этой маски белым цветом (сглаживание делается юнькой автоматом, т.к. у текстуры маски задан FilterMode=Bilinear):

+ Показать

А вот так выглядит заполнение этой же самой маски текстурой:

+ Показать


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

#48
(Правка: 12:57) 12:56, 24 мая 2020

kkolyan

> 1. каков у вас в игре размер уровня в квадратных метрах?
Разные размеры, но большие. Например тот что на картинке: 150x70x70 метров

>2. какова максимально допустимая толщина (ширина) следа
10 см

>3. какова сложность пола? (лучше скрином на похожую игру)
Скрин нашей геометрии:

+ Показать

>4. насколько произвольно игрок может махать мечом в игре?
>5. насколько свободно игрок выбирает траекторию удара?
Вообще все произвольно, есть разные мечи и пушки. Еще игрок может пушкой дотянуться до дальней части помещения. То есть рисовать можно как хочешь, всюду, от души XD
Но что-то сдается мне, что тут возникнет большя проблема с тем, что нужно иметь на всем коллайдеры или организовывать свой поиск обьекта, который встретится на пути луча.

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


Во избежание путаницы попробую структурировать все что понял:

1. В текстуру мы рендерим линию низкого разрешения используя РЕНДЕР В ТЕКСТУРУ (как показано в статье)
Причина использования рендера в текстуру: рендер осуществляется на стороне GPU, исчезают тормоза пересылкой текстуры в видеопамять.

2. Качество линии повышаем путем:
- блендинга с основной текстурой стен, пола, всего.
- алгоритмически


> реализация вывода красивого следа на основании простой линии низкого разрешения алгоритмически нетривиальна.
Вот с этим я не знаком. Это задача рендера плавных линий. Вы о ней говорите?

#49
(Правка: 13:48) 13:48, 24 мая 2020

Alerr
> Скрин нашей геометрии:
трудно понять, что происходит на картинке и где там бегательные поверхности) я правильно понял, что топология уровня - вертикально вытянутая череда площадок, соединенных лестницами и/или лифтами?

#50
15:28, 24 мая 2020

kkolyan
> трудно понять, что происходит на картинке и где там бегательные поверхности) я правильно понял, что топология уровня - вертикально вытянутая череда площадок, соединенных лестницами и/или лифтами?

Топология - куча "кубов" висящих в воздухе. Кубы имеют пол (верхняя часть) и стены - остальные грани. Так же имеются просто стены: растянутые полигоны, которые блокируют обзор и органичивают видимость скайбокса.

#51
(Правка: 21:44) 16:25, 24 мая 2020

Alerr
> 1. В текстуру мы рендерим линию низкого разрешения используя РЕНДЕР В ТЕКСТУРУ
> (как показано в статье)
> Причина использования рендера в текстуру: рендер осуществляется на стороне GPU,
> исчезают тормоза пересылкой текстуры в видеопамять.
здесь ок

Alerr
> 2. Качество линии повышаем путем:
> - блендинга с основной текстурой стен, пола, всего.
> - алгоритмически
а здесь - не совсем. чтоб было хорошо, нужно не просто текстуру пола/стен с линией, а блендить текстуру пола/стен с некой небольшой красивой текстурой следа (повторяемой), используя лоурезную текстуру со следом как маску блендинга. типа того, как это часто делают при текстурировании ландшафта.

итоговый цвет пикселя = lerp(цвет из текстуры стены, цвет из текстуры следа, цвет из маски)

делать ли какое-то дополнительное алгоритмическое сглаживание? попробуйте без этого. для толстой, удачно затекстурированной линии вам может хватить и встроенной в юнити билинейной фильтрации маски. (10 см для уровня плоащдью 100х100 метров - это разрешение маски 1024х1024 - т.е. запас есть)

#52
16:29, 25 мая 2020

Alerr
В Юньке нет возможности динамически изменять запеченые карты света. Только при помощи перезагрузки сцены.
Однако, есть способ - можно сделать две одинаковые сцены и перезагружать их когда карта света изменилась. Все же возможность загрузки нескольких сцен - очень мощный инструмент.

#53
(Правка: 17:21) 17:21, 25 мая 2020

sledo
> В Юньке нет возможности динамически изменять запеченые карты света. Только при
> помощи перезагрузки сцены.
Это везде делается сменой текстуры с лайт мапой.

#54
19:25, 25 мая 2020

Понятно :)
Не теряйте меня, я еще не добрался до отрисовки следа лучами.
Как сделаю что-то, отпишусь о результатах

#55
21:53, 26 мая 2020

kkolyan
Разбираюсь с деталями того как происходит нанесение цвета в определенную часть маски. Хотя все написано, но мне все же приходится внимательно со всем переознакомиться так как я very sloooow

Пока появилось 2 основных вопроса.

Вопрос 1
Изучаю этот кусок кода:

v2f vert (appdata v) {
        v2f o;

#if UNITY_UV_STARTS_AT_TOP
        // Metall/Direct3D :
        float2 uvRemapped   = v.uv.xy;
               uvRemapped.y = 1. - uvRemapped.y;
             uvRemapped   = uvRemapped * 2. - 1.;
#else
        // OGL :
        float2 uvRemapped = v.uv.xy * 2. - 1;// [0-1]=>[-1,1]
#endif

        // The w component of the vector, also known as perspective divide,
        // should be set as 1 since this is an orthogonal projection
        o.vertex     = float4(uvRemapped.xy, 0., 1.);
        o.worldPos   = mul(mesh_Object2World, v.vertex);// raycast pos!
        o.uv         = v.uv;

        return o;
      }

(A)

o.vertex     = float4(uvRemapped.xy, 0., 1.);
На сколько я понял, это переносит разертку маски в screenSpace

Возник вопрос, где будет вершина после того как произведется умножение?
(B)

mul(meshGameobject.transform.localToWorldMatrix, v.vertex);

Я попробовал заменить это на:
(C)

mul (unity_ObjectToWorld, v.vertex).xyz;

Результаты разные. В пункте (B) получем вектор явно не worldSpace. Но тогда где?

Вопрос2
Непонятно что делает вторая строчка. Вершинный шейдер

mPaintInUV
приведен выше.
DrawMesh
вроде как рисует меш, но как, в каких координатах происходит рисование точки ?
commandBuffer.SetRenderTarget( maskTexture );
commandBuffer.DrawMesh(meshToDraw, Matrix4x4.identity, mPaintInUV);
#56
(Правка: 23:00) 22:06, 26 мая 2020

Alerr
> Возник вопрос, где будет вершина после того как произведется умножение?
Там подписано что это для raycast, то есть это не позиция вершины, а направление луча.

Alerr
> mesh_Object2World
Было бы интересно увидеть источник этого кода, подозреваю что это пользовательская матрица сделана вручную. Если она используется для построение луча (направления, нормали), а не позиции, то вероятнее всего там только поворот от localToWorldMatrix матрицы, а смещение обнулено.

#57
(Правка: 22:37) 22:36, 26 мая 2020

foxes
>Там подписано что это для ratcast, то есть это не позиция вершины, а направление луча.
Да нет. Луч raycast там никак не связан с этой матрицей (его не переумножают с ней).

>Было бы интересно увидеть источник этого кода,
Оно прописано так:

tex.UpdateShaderParameters(meshGameobject.transform.localToWorldMatrix);
public void UpdateShaderParameters (Matrix4x4 localToWorld) { mPaintInUV.SetMatrix ("mesh_Object2World", localToWorld); }

То есть после умножения мы получаем worldSpaceDir?

//===
Из анализа кода:
позиция мыши передается в шейдер в worldSpace.
Позиция цвета кисти в вершинном шейдере вычисляется на основе lenght до mouse worldSpace.
Похоже, что вся развертка модели трансформируется в worldSpace. То есть: когда мы наносим цвет, развертка выставляется параллельно раскрашиваемой грани. Ну, она и так всегда параллельна при растеризации. Я говорю о том, что она реально параллельна в world space так как ее позиция считается в worldSpace для каждой грани.
Что думаете? Бред? XD

#58
19:07, 27 мая 2020

В общем порядочно повозившись пришел к тому, что рендер в текстуру позволяет рисовать линии всюду.
Добился сглаженной линии:

+ Показать

При разрешении текстуры 8129 unity тормозит. Непонятно что тормозит, профайлер/дип профайлер не загружены. И GPU тоже незагружено. Незнаю как на биде, пока не пробовал.

#59
1:19, 28 мая 2020

Alerr
а какой по разрешению участок маски приходится на грань этого куба?

Страницы: 13 4 5 68 Следующая »
UnityФорумПрограммирование