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

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

Страницы: 1 2 3 4 5 Следующая »
#15
12:40, 22 мая 2020

Alerr
> Спасибо, в целом понял общую идею! Но вот эта деталь не совсем понятна: как
> части этой текстуры должны проецироваться на обьекты??? Нужно вручную сделать
> UV2 для всех обьектов сцены?
Эта текстура - это не текстура в привычном понимании. это просто большая матрица битов, по которой шейдер (написанный вами) поймет где рисовать следы. в качестве UV для обращения к этой текстуре могут (я не вижу других вариантов особо) использоваться нормализованные мировые координаты точки пола (worldPos.xz в шейдере).


#16
(Правка: 14:21) 14:20, 22 мая 2020

Нашел инструкцию от unity

Можно находить току текстуры и писать в нее! Это здорово, но было бы еще лучше, если бы это работало не только для MeshCollider. MeshCollider, в моем случае, бесполезен так как придется все им обставить, что очень нехорошо.
Не знаете почему hit содержит textureCoord != (0,0) только для MeshCollider? Как получить эти координаты для других коллайдеров?

#17
14:40, 22 мая 2020

> Не знаете почему hit содержит textureCoord != (0,0) только для MeshCollider?
для других коллайдеров у движка нет инфы чтобы их вычислить. Только самому считать.

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

#18
14:50, 22 мая 2020

kkolyan
>Только самому считать.
Похоже да, занимаюсь этим.

>Есть догадки, почему это вам не поможет. Отпишитесь обязательно о том, как пойдет)
Почему? Отпишусь. Думаете SetPixels очень медленный? Да, он медленный, но я думаю через Blit рисовать.

#19
16:10, 22 мая 2020

В общем потестировал, получилось такое:

+ Показать

Качество, конечно, не устраивает. Линия совсем не похожа на линию от лазера. Думаете, нельзя добиться нормального качества следа от луча?

#20
(Правка: 18:26) 18:25, 22 мая 2020

Alerr
> В общем потестировал, получилось такое:
хм. потенциальную проблему, которую я предполагал, вы успешно обошли.
вы просто рисовали в дефолтную текстуру дефолтного материала и так получилось?
делали ли что-то специально чтобы у каждой грани был свой экземпляр текстуры?

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

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

#21
18:40, 22 мая 2020

kkolyan
>вы просто рисовали в дефолтную текстуру дефолтного материала и так получилось?
Да, рисовал в текстуру материала, которую передаю в uv2. Беру WorldPos, конверитрую в UV и меняю область текстуры-маски.

>делали ли что-то специально чтобы у каждой грани был свой экземпляр текстуры?
на все обьекты одна общая текстура.

> кстати а вы специально его здесь таким маленьким сделали?)
512, не так и мало, но да, экономлю. Да, при повышении качество улучшается. Позже буду экспериментировать больше с рисованием линий. Пока крашу все через SetPixels.

#22
(Правка: 18:51) 18:46, 22 мая 2020

Alerr

> 512, не так и мало
по скрину выглядит будто гораздо меньше

> на все обьекты одна общая текстура.
а как она развернута на эти параллелепипеды? Эти параллелепипеды - клоны друг друга? есть ли грани, которые ссылаются на один и тот-же участок текстуры своими UV-хами?

#23
(Правка: 19:49) 19:47, 22 мая 2020

Alerr
если ты растянешь текстуру 512 по всем своим объектам так, чтобы каждому достался его персональный кусок текстуры, то конечно она окажется маленькой. Если не растянешь, а будешь дублировать - след меча тоже будет дублироваться.

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

Вот и интересно, какой из вариантов выпал.

#24
23:29, 22 мая 2020

kkolyan
Сейчас взялся за рисовалку :)

>а как она развернута на эти параллелепипеды? Эти параллелепипеды - клоны друг друга? есть ли грани, которые ссылаются на один и тот-же участок текстуры своими UV-хами?

В uv2 развертка, которая проецирует все обьекты на разные части текстуры, чтобы не пересекались.
Параллелепипеды - клоны друг-друга, но uv2 разные.

> если ты растянешь текстуру 512 по всем своим объектам так, чтобы каждому достался его персональный кусок текстуры, то конечно она окажется маленькой
Думаю это единственный вариант. Не вешать же на каждый обьект доп текстуру... Или вешать... Хз, посмотрим.

> юнька форкает
Извините, не понял сленг. Форкает? Создает дубликат? Я все делаю руками, unity, вроде, за меня тут мало делает.
Что такое форкает, можете пояснить что может происходить?

#25
(Правка: 0:40) 0:40, 23 мая 2020

kkolyan
Deep profile выдает:

+ Показать

Вы про это говорите, что оно тратит ресурсы?

#26
0:59, 23 мая 2020

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

#27
(Правка: 3:06) 3:03, 23 мая 2020

Alerr
> Форкает? Создает дубликат?
> Что такое форкает, можете пояснить что может происходить?
да, имел ввиду дупликат. но нет, она не делает. просто увидев твой пример на секунду усомнился в этом.

> В uv2 развертка, которая проецирует все обьекты на разные части текстуры, чтобы не пересекались.
> Параллелепипеды - клоны друг-друга, но uv2 разные.
ок, я понял. основной UV ты используешь для обычных текстур, а UV2 выделил специально под эту текстуру со следами и она растянута по всем объектам.

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

* Но проблема в том, чтобы в этой текстуре смочь нарисовать прям красивый след, она должна быть невероятно большого размера.
Выход: не используй эту текстуру не как рисунок, который будет как есть рисоваться поверх основной.  Используй ее как матрицу битов, по которым красивую линию проведет шейдерный код.

* Вторая проблема в том, что операция отправки нового варианта текстуры на GPU дорогая (что ты и увидел в профайлере).
Тут есть два решения, которые можно использовать и вместе и раздельно:
1. выдели разным частям уровня свои отдельные UV2-текстуры. памяти будет жрать столько же, но каждое изменение будет дешевле. а если уровни большие, то это уже обязательная мера (с выгрузкой далеких участков и подгрузкой близких)
2. отправляй изменения на GPU не каждый кадр, а например каждый третий. Красота других эффектов, к примеру, может это достаточно замаскировать.

* Третья проблема в том, что ты можешь задолбаться делать развертки. Если форма поверхности, на которой нужно оставлять следы проста (например если это только пол с кривотой не более 30°), то есть выход: Определяй UV2 в коде шейдера автоматически на основании глобальной координаты точки.

#28
11:07, 23 мая 2020

kkolyan
Что-то проблем много, кажется имеет смысл запариваться с линией только в случае если это ключевая механика.

> Выход: не используй эту текстуру не как рисунок, который будет как есть рисоваться поверх основной. Используй ее как матрицу битов, по которым красивую линию проведет шейдерный код.

Не подскажете как это можно сделать? Как можно провести красивую линию по маске?

#29
(Правка: 13:21) 12:56, 23 мая 2020

Alerr
почему вы так избегаете написания шейдеров? в этом ничего архисложного. очень советую преодолеть этот порог, т.к. современные игры без них немыслимы, а surface shaders в Unity особенно дружелюбны.

Alerr
> Не подскажете как это можно сделать? Как можно провести красивую линию по маске?
трудно объяснить, если вы совсем не знакомы с написанием шейдеров. а поняв их основы вы и сами сможете многое. попробуйте сделать на шейдерах хоть как-то. не понравится результат - пишите, посмотрим.
если совсем коротко, то в шейдере вы должны определить цвет точки на основании всех параметров точки вроде нормалей, координат и тому подобного. по сути это вывернутый наизнанку SetPixel на стороне GPU. типичный "материальный" шейдер тупо берет этот цвет из основной текстуры по UV. А ваш шейдер кроме этого должен еще обратиться к доп-текстуре по UV2 (вычисленным прямо в шейдере или заданным в модели - неважно) и учесть след в цвете пикселя. Здесь можно и интерполировать и/или проявлять в местах следа другую текстуру да и вообще все что угодно.

Alerr
> имеет смысл запариваться
вы уже запарились) а хороший геймдев собственно из такого и состоит.

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