Фотографичность в Unity? Повышаем четкость картинки.

Научился сам? Помоги начинающему.

Фотографичность в Unity? Повышаем четкость картинки.

Сообщение sledo 21 окт 2018, 22:30

В ходе детального изучения вопроса, я все больше приходил к выводу что фотографичность лишь косвенно касается фотореалистичности (тема фотореалистичность в Юнити) и ее надо выносить в отдельную тему. По своей сути это абстрактное понятие которое включает в себя набор разных технических приемов которые улучшают конечное качество изображения. Применять их можно в любых художественных приемах для того что бы как можно более точно передать видение художника.
Тут же становится ясно, почему происходит подмена понятий фотографичности и фотореалистичности. Для того что бы добиться фотографической копии реального мира проще всего использовать виртуальные копии этого реально мира в качестве игровых объектов. Т.е. когда человек возьмет фотографию в качестве текстуры объекта, а сам объект будет иметь точную копию реального объекта, то создается основа для художественного направления - фотореалистичность и уже картинку можно назвать фотореалистичной. Обычно проблема всегда заключалась в том что добиться качественной картинки не всегда получалось и если брать реалии Юнити, то в подавляющем большинстве случаев это была замыленная игрушечная графика. То что здесь будет описываться, призвано убрать эти искажения и показать высокую четкость, и естественность окружения.
И если при использовании фотореалистичной графики, применять приемы для достижения фотографичности, то получится приближенная копия реального мира. В этом и кроется начало подмены понятий, когда под фотореалистичностью начинают подразумевать фотографическую точность исполнения виртуального мира. Что конечно заблуждение.
В ходе детального изучения вопроса стало ясно, что знание приемов фотографичности крайне важны для художника, для того что бы он мог максимально точно изобразить то что задумал (тут у многих может возникнуть логическое противоречие между ранее предложенными постулатами. Но я не стану вносить правки и на это есть свои причины). Тонкое место тут в том, что при использовании фотореалистичных текстур вы уже будете добиваться большой фотографической точности, что конечно достаточно скверно для вас, как для художника. Высокая фотографическая точность, может перекрывать ваши творческие усилия и они могут попасть в тень от восхищения схожести картинки с реальным миром. Отсюда получается что чем менее фотореалистичны будут игровые объекты, тем более полезны фотографические приемы, тем точнее вы сможете передать то, что задумали. Отсюда же становится ясно основное будущее игр.
С другой стороны, это может быть плюсом, когда человек уже привыкнет к картинке и начнет замечать именно заложенные в ней творческие приемы, что конечно может открыть для игрока ваш мир заново. А это многого стоит.
В свою очередь, если вы создаете другой мир, например где вы решили сделать небо красным, облака желтыми, деревья зелеными, а землю синей (в общем ужас эпилептиков), то высокая четкость изображения даст вам возможность передать игроку практически все так как вы задумали, без учета того что все замылится и замультяшится. Плюс у вас в руках появятся полезные инструменты для того что бы замылить и замультяшить именно так, как вы хотите.

В некоторых случаях я отделю теорию от практики. Теория это то что работает всегда, не важно где вы ее применяете. Практика это то как теория работает в конкретном месте, в данном случае на Юнити. Теория в данном случае, это примерно то же как и закон о сохранении энергии, зная и понимая который вы можете объяснять и прогнозировать практически любые события в жизни.

Фотографичность

Небольшое предисловие.
Расследование показало, что как такой дисциплины по фотографичности нет. По факту это то что путают с художественной дисциплиной "фотореалистичность", а именно - просто набор приемов которые могут серьезно отличаться друг от друга в зависимости от условий создания изображений высокой четкости в различных условиях среды, которые максимально копируют что либо. Это чисто технические моменты и думать об этом надо только с точки зрения механики. Определенную пользу фотографичность может принести и даже в зависимости от условий поставленной задачи, принести серьезную пользу. В частности существенное повышение качества конечного изображения, его честкости, выявление технических недостатков инструментов и прочее.
Надо для себя понять, что будь вы художник который создает пока несущестующий мир, или программист который использует строгую логику, для достижения конечного результата вы используете инструменты -все с помощью чего вы творите, это инструменты для вашей работы. Нет ни каких строгих правил, нет ни каких ограничений. Все эти правила и ограничения сидят у вас в голове и вы сами себя ограничиваете. Если для достижения положительного результата вам надо использовать фотографичность - используйте. Это точно такой же инструмент, как и все остальное. Просто, не увлекайтесь этим и уж тем более не ставьте его в правило. У вас есть лишь технические ограничения с которыми придется считаться, но это лишь значит что в большинстве случаев вы не сможете решить проблему в лоб и только.
Так же крайне важно понять что человек не способен сразу понимать что хорошо, а что плохо. Это понятия относительные и мыслим мы именно относительно чего либо. До тех пор пока вы не увидите что такое хорошо, вы не сможете понять что такое плохо и наоборот. Поэтому можно и нужно ошибаться (но лучше конечно учиться на чужих ошибках), делать плохие вещи и стремиться к лучшему, если вы хотите стать истинным профессионалом. Отсюда же вытекает, что если выдостигли как вы считаете совершенства, то развиваться сможете только в худшее. Позволю себе небольшое отступление, для того что бы привести аналогию. Не так давно был отснят очередной эпизод Звездных войн - Последние джедаи. Мне нравятся сказки и на мой субъективный взгляд ничего стоющего в этой картине нет кроме одного. Примерно в конце фильма когда главные герои сражаются друг с другом, каждый из них пытается перетянуть другого на свою сторону силы и что самое интересное, они оба правы в своих взглядах. Что самое забавное и что вообще лишает смысла всю Вселенную Звездных войн, это то что тут они прямо говорят о том что не может быть только добро или зло, они могут существовать только вместе и всегда будут уравновешенны друг другом. Т.е. кто бы не победил, всегда найдется тот кто перейдет на темную сторону или на светлую сторону, просто по определению. Для баланса. Как бы не банален был сюжет, но эта сцена прямо показывает что, что бы узнать что такое добро, нужно что бы было зло (привет атеистам и их игнорированию Библии с эпизодом райского дерева познания добра и зла). Отсюда же выходит - если не будет зла, то и добра, тоже не будет.
Так вот - фотографичность с точки зрения изобразительного творчества - это абсолютное зло. Однако не познав его, вы не сможете узнать что такое истинное творчество.

Так же следует понимать что все предоставленные демонстрации лишь плашки которые показывают возможности вашего творчества.

Теперь приступим.

Определимся, что это такое фотографичность.
Конкретно к слову фотографичность определения я не нашел. Везде даются ссылки на какое то другое слово которое в конце концов приводит к
ФОТОГРАФИГЧЕСКИЙ, фотографическая, фотографическое.
1. прил. к фотография в 1 знач.; служащий для фотографии. Фотографический аппарат. Фотографическая пластинка.
2. Полученный посредством фотографии. Фотографический снимок.
3. перен. Совершенно точный, очень сходный, как будто сделанный при помощи фотографии (книжн.). Фотографическое описание. Фотографическое изображение. Фотографически (нареч.) точно.

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

Далее нам надо выявить основные особенности с помощью чего оно достигается и уже после того как будет ясно что это, уже добиваться фоторафической точности.
Вообще я не доволен положением дел с терминами в игрострое. Они слишком размыты. Люди пихают все в одно понятие и после сами не знают чего хотят.
Если в фотореалистичности вы вольны уклоняться от излишней детализации или деталями создавать определенное настроение и атмосферу, то в фотографичности точное внимание к деталям имеет ключевую роль. Например если вы не используете сканы, то придется переделывать развертки, вставляя фотографичные текстуры на место старых фрагментов, что бы текстура правильно легла. Это само по себе кропотливое занятие, а если придется переделывать сотни таких разверток, то еще и очень долгое. Поэтому в большинстве случаев для достижения фотографичности придется использовать либо фотографии, либо отсканированные материалы, если вы хотите воссоздать реальный мир с фотографической точностью и при этом потратить чуть меньше времени чем ваша жизнь.

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

Высокая четкость изображения, задает серьезную планку к качеству конечного изображения на мониторе, и использование разных постэффектов и других искажающих эффектов, крайне не рекомендовано. Единственно что полезно и скорее всего придется использовать это сглаживание или использовать какой то подобный эффект. Сглаживание смажет лесенки что даст ровность воспроизведения поверхности, но смажет и сами текстуры. Поэтому увлекаться этим не стоит и на мой взглят вполне достаточно сглаживания в 2х у MSSA.
Есть много других алгоритмов сглаживания, которые могут подойти в каждом конкретном случае. Это ваш инструментарий, вы должны изучить его (это отдельная серьезная тема).
Соответственно для использования сглаживания, придется использовать Forward Rendering https://docs.unity3d.com/Manual/RenderingPaths.html/ который в последних версиях Юнити переключается у камеры в строке Rendering Paths.

Сглаживание даст искажения текстур, к этому надо быть готовым.
Так же критически важно подбирать верное разрешение текстур, что бы уже сами текстуры не давали искажения. Разрешение играет едва ли не ключевую роль в качестве текстурирования. Каждое разрешение хорошо в определенных условиях когда оно будет давать 100% качества.
В большинстве случаев, максимальное разрешение мониторов равно 1920x1080. В некоторых случаях оно больше и вроде как максимум достигнут в так называемом 4к разрешении которое равно 4096 х 3072. Очень важно понимать для какой аудитории вы создаете продукт, для того что бы использовать текстурирование верного разрешения. Если вы будете использовать текстуры например с разрешением в 8192, то ни монитор, ни телевизор физически не сможет отобразить эту текстуру, а значит он ее сожмет, что даст искажения. Т.е. практического смысла в использовании такого рода разрешения текстур нет ни какого. То же самое и для разрешения текстур в 4096, если ваша целевая аудитория имеет типичный монитор с максимальным разрешением в 1920x1080, который пока что наиболее популярен среди пользователей. Т.е. в большинстве случаев максимальное разрешение текстур должно составлять 2048, которое даст наименьшее возможные искажения при нахождении камеры в упор к предмету. Однако надо понимать, что чем дальше вы отодвигаете камеру от предмета, тем больше искажений будет получать текстура.
Теперь про минимальное разрешение. В теории с минимальным разрешением текстур все немного сложнее. Если с разрешением в 2048 вы можете не бояться показывать предмет в упор, и даже полезно это делать, то с разрешением в 1024, без потери качества вы можете показывать предмет только на определенном расстоянии. Потому что если вы будете давать возможность посмотреть игроку на текстуру с разрешением в 1024 пикселей в упор, то он увидит качество в 2 раза хуже чем у номинальной текстуры в 2048, потому что она будет растянута до разрешения в 2048. Т.е. когда вы показываете игроку высококачественную текстуру в 1024 в упор, ее качество в 2 раза хуже чем если бы вы ее показывали на расстоянии когда она имеет номинальный размер в 1024 - человек будет видеть размытую текстуру.
Отсюда же следует понимать, как именно было добыто разрешение текстуры. Если с помощью фотоаппарата, это одно, если с помощью сжатия, это другое. Я лично изменял размер обычным Paint'ом.

На практике же в Unity дальнейшие эксперименты с текстурами показали следующее - критически важно использовать номинальное разрешение текстур для предметов которые будут на определенном расстоянии. Получить такое же качество как и у текстуры с разрешением в 512 из текстуры с разрешением в 1024 на данный момент не получится. Поэтому использование текстур сугубо одного разрешении - крайне не желательно. Получается, что в идеале надо заменять качество текстур на подобии лодов для того что бы картинка имела высокую четкость изображения или же сами лоды настроить так что бы они имели оптимальные разрешения текстур.

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

Видео текстуры 1


показывает качество вместе с картами освещения. Разрешение 1024 меняется на и обратно 512. (лучшее качество у 1024)
Видео текстуры 2


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

Видео текстуры 3 и 4



показывает обратную ситуацию когда качество у разрешения 512 выше чем качество у разрешения 1024. Сначала высокое разрешение, потом низкое.
Тоже самое с картами освещения

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

и текстуры 8


А вот с тайлингом ситуация немного иная. Я масштабировал примив куба до 10 и соответственно сделал тайлинг в 10 что бы получить прежний размер текстур. Как видно качество не потерялось, однако есть артефакты со смещением.
Видео текстуры 7


Задайтесь вопросом - кто из вас об этом задумывался? Видимо отсюда и растут ноги вечно замыленых и мультяшных картинок из Юнити.
Я бы предложил перед текстурированием, создать текстуру с сеткой шагом в 1 пиксель для каждого разрешения. Это будет ваша калибровочная сетка. На каждый предмет в сцене необходимо применять эту калибровочную сетку, для определения наиболее оптимальных разрешений текстур для объектов в сцене на разных расстояниях (видео текстуры 10


). В моем случае для текстур разрешением в 1024 наибольшее качество достигается когда объект занимает примерно половину экрана по горизонтали (куб 1х1), соответственно для текстур с разрешением в 512, в четверть. Для вас это значение может быть иным, поэтому если вы занимаетесь этим серьезно, то я бы рекомендовал определить калибровочное железо и на нем сделать калибровочную таблицу расстояний и размеров сетки, когда достигается максимальное качество.
Но в принципе можно просто иметь текстуры нескольких разрешений и попеременно применять их на материал выявляя наилучшее качество. Текстуры 11 (К сожалению технические ограничения похоже не позволили наглядно продемонстрировать прием)

Теперь что касается настроек текстур.
Из всех настроек, если не считать streaming mip maps, на качество влияют следующие:
1) Generate Mip Maps
2) filter mode
3) MAx size
4) resize algorithm
5) compression

Сравнивать будем с номиналом где все настройки выставлены по умолчанию, но галочка Generate Mip Maps снята.
Generate Mip Maps
Все выставлено по умолчанию - результат искажен. Видео Текстура 13


Юниты настоятельно рекомендуют использовать Generate Mip Maps для улучшения производительности. По сути именно эта функция отвечает за то что бы более низкое разрешение текстур накладывались на предметы которые находятся далеко от камеры. Т.е. она преобразует текстуру с разрешением 1024 в более низкое. Работает криво.
Она имеет дополнительные настройки. посмотрим на искажения в них.
1) border mipmaps - работает с границами текстуры, что и видно на видео.
Текстуры 14


2) Mip Map Filtering - как видно из названия, способ фильтрации. Наилучшее качество дает фильтр Kaiser
Текстуры 15


Попробуем его сравнить с номиналом
Текстуры 16


Как видно, ситуация все равно хуже чем без использования Generate Mip Maps, но лучше чем с использованием фильтра box

3) mip maps preview ни как не влияет на качество
4) Fade Out Mipmaps ни как не влияет на качество

Filter Mode
Наилучшее качество дает Point(no folter), но вблизи дает пиксельность.
Видео текстуры 17


Сначала сравнение с Bilinear у которого отключен Generate Mip Maps. Затем с Bilinear и включенным Generate Mip Maps с фильтром box, затем с фильтром Kaiser.

Фильтр Trilinear.
Текстуры 18


Сначала сравнение с Bilinear у которого отключен Generate Mip Maps. Затем с Bilinear и включенным Generate Mip Maps с фильтром box, затем с фильтром Kaiser.

Далее resize algorithm.
Как ни странно, но на качество не повлиял. Юниты утверждают что Bilinear в некоторых случаях может улучшить качество.

compression
Так же на качество не повлиял.

Итог: Наилучшее качество достигается с отключенным Generate Mip Maps, и у Filter Mode выставленным Point(no folter).
Если у текстуры появилась зернистость, то без Generate Mip Maps не обойтись, выставляем Mip Map Filtering в Kaiser. На горизонтальных поверхностях могут появиться артефакты. Тогда переключаем на Box. И если все это не помогло, то включайте фильтры Filter Mode.
И конечно все это надо применять непосредственно к текстурам, а не к картам освещения. С картами освещений вроде как косяков нет, но это мы еще посмотрим позднее.
Из общих настроек интересен только Texture Quality.

Ну что же, давайте попробуем добиться максимальной четкости изображения.
Я откалибровал сцену сеткой что бы понимать какие разрешения текстур применять и начал применять это к материалам. И вот выяснилось еще одна нехорошесть - стена выполнена одним мешем, а значит к ней я могу применить только одну текстуру. Но стена вокруг меня и на разном расстоянии. Пришлось дублировать ее и на дальнюю стенку применять текстуры с разрешением в 256, в то время как к первичной стене применил текстуры с разрешением в 1024. И вот если стоять строго на одном месте мы получаем четкую картинку практически без размытий и искажений.
Видео текстуры 12


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

Немного иная ситуация с текстурами на которые действует перспектива. Например пол. Тут уже высокая четкость текстурирования скорее зло, чем добро. Что получается? Когда отрисовывается наиближайший ряд пикселей текстуры к камере, то показывается 100% информации. Следующий ряд пикселей из за перспективы, уже будет меньше, а значит часть информации должно быть утеряно. Третий ряд еще меньше, а значит информации остается еще меньше и так далее.
Видео Текстуры 19


Получается что если вы используете текстуры высокой четкости, то глаз сразу замечает так сказать градиет качества от лучшего к худшему в зависимости от удаления от камеры. Это можно нивелировать если один пиксель текстуры, будет отображаться на несколько пикселей в мониторе, т.е. если использовать текстуры довольно низкого разрешения. В таком случае потери информации не будет происходить до определенного расстояния в зависимости от того на каком расстоянии закончатся "свободные" пиксели,
видео Текстуры 20


и
текстуры 21


(линии в видео 21 прямые. Добро пожаловать в мир оптических иллюзий), а сама потеря информации уже не будет так заметна, поскольку сама текстура не высокого качества. С другой стороны, на определенном расстоянии, текстура будет иметь 100% качество, что может так же бросаться в глаза. Поэтому тут использование различных фильтров в Filter Mode скорее благо, чем нет.
Кроме того, при смене ракурсов камеры, на полу может появиться зернистость из за того что в каждом кадре происходит разная потеря информации.
Тут же нюанс с атласами. Многие разработчики загоняют в атласы все что не попадя, считая это аксиомой оптимизации. Потом искренне недоумевают почему их игра выглядит как кусок обмылка. Смысл атласов в том, что уменьшается количество проходов по материалам, но так ли это важно если решать проблему в лоб? Вот представим что вы имеете высококачественные текстуры с разрешением в 2048 и все выглядит хорошо и даже не особо тормозит. Вы решаете все это дело оптимизировать. Первое что должно возникать у вас в голове - зачем вы хотите это делать? Я пришел к выводу что не разработчик должен подстраиваться под все разнообразие ПК, а игроки должны иметь железо под конкретные задачи. А эти задачи должны задавать разработчики, как это происходит в консолях. Только тогда игроки смогут получить номинальное качество, что и нужно разработчикам. Так вот, вы должны четко понимать свою целевую аудиторию. Если вы создаете игру для калькуляторов, то нет ни какого смысла использовать высококачественные текстуры. Если вы создаете свою игру для средних ПК, или хороших ПК, то надо всегда подходить к оптимизации очень осторожно (главное правило - не навредить. И вообще это должно стать руководством в жизни). Итак атласы. Вот значит вы используете текстуры с разрешением в 2048, у вас их 10 штук и вы загоняете 10 этих текстур в один атлас с разрешением в 4096. Оптимизация? На первый взгляд - безусловно. Но в итоге вы получаете качество текстурирования в 1024. Т.е. что бы без потери качества загнать эти текстуры в один атлас, ваш атлас должен иметь разрешение в как минимум 8192. Но в такой атлас у вас поместится 16 текстур с разрешением 2048, а не 10. И вопрос - что вы оптимизировали? А теперь немного математики - то отчего так корежило некоторых товарищей. Для просты счета будем брать только одну ось разрешения. 10 текстур по 2048 пикселей = 20480 проходов по ним. Сожмем их в атлас до 1048, атлас получится в 4096 в который поместится 16 текстур и того по атласу будет 65536 проходов. Я думаю ясно что в данном случае с атласом ни какой оптимизации не получится, он будет занимать и места больше, и проходов по нему будет больше и качество ниже. Единственный плюс остается только в том что не надо брать для обработки новый материал, для обработки его текстуры.

Та же ситуация с развертками. Чем большая поверхность модели, тем большее разрешение текстур придется использовать для достижения хорошего качества. Например на представленном довольно не большом диване (видео текстура 9) текстура с разрешением в 1024 и хорошо видно насколько большие клеточки калибровочной сетки, т.е. для него придется использовать текстуры разрешением в 4096 что бы добиться хорошего качества на близком расстоянии. Поэтому хорошая практика в таком случае разбивать предметы на более мелкие, что бы к ним можно было применять текстуры с более низким разрешением.


Затем важно понимать технические ваши ограничения. Вам придется использовать высококлассные средства визуализации, такие как мониторы, видеокарты и программное обеспечение. Если у вас будет дешевый монитор, который например не сможет точно передать цветовую текстуру изображения которое на него приходит, то вы физически не сможете увидеть качественный результат, а значит физически не сможете добиться высококачественной картинки. Тонкое место в том, что у большинства пользователей те же мониторы далеко не высококачественные, а значит они физически не смогут увидеть высококачественную картинку которую вы для них подготовили на высококачественном железе. Кроме того, очень важен размер монитора. Чем меньше его размер и выше разрешение, тем более мелкая зернистость матрицы и как следствие более четкая картинка с монитора. Т.е. одно и то же изображение может выглядеть по разному в одном и том же разрешении, но с разным дюймовым размером экрана. Увидеть вы это сможете если запустите какую то игру в окне с разрешением 800х600 и запустите тоже самое на старом мониторе с его общим разрешением в 800х600. Поэтому я повторюсь, что убежден что разработчикам давно пора вводить градацию конфигурации ПК, под конкретно которое была создана игра, от и до. Писать вплоть до моделей железа, версии драйверов в котором игра будет выглядеть номинально. Более того, если человек купил самый дешевый монитор, который у него еще и весь выцвел, то увидеть он может совсем не то что видят остальные. Поэтому если вы серьезный разработчик, у вас должно быть несколько тестовых сборок для того что бы вы могли увидеть свое творение так, как могли бы это увидеть люди с разными конфигурациями ПК.

В связи с недавно вышедшим обновлением Таркова, сделал билд где можно наглядно увидеть разницу между дефолтными настройками текстур с не подобранным разрешением и настроенной комнатой. Вообще конечно надо было его сделать намного раньше, но как всем нам известно, время, это именно то чего вечно не хватает. Выкраил пару часиков на это благое дело.
Пример полностью показывает разницу между двумя подходами и демонстрирует насколько слабо Юнити работает с текстурами. Так же он демонстрирует артефакты зернистости и проигрыш в качестве перед дефолтными настройками. Надеюсь теперь даже у самых ярых скептиков не останется сомнений в том что подбор разрешения текстур и настройка самих текстур является критически важным аспектом в графическом качестве игр.
Примеры ошибок:
1) Книги, дверь и фото кошки внизу у стенки, имеют артефакты зернистости. Разрешение текстур кошки 256, книг 1024, дверь 2048. Ошибки при создании перспективы. Разрешение надо снижать, либо все замыливать.
2) Стол имеет большую четкость как раз при дефолтных настройках текстуры, при том что разрешение текстур у них одинаковое. Ошибка подбора разрешения текстуры.
Сам билд - https://yadi.sk/d/w50gX9YszV1kNw

Еще один билд, который демонстрирует сохранение качества текстуры с ростом расстояния, посредством использования верно подобранного разрешения. Так же потеря качества при использовании текстуры высокого разрешения на расстоянии. https://yadi.sk/d/MnBetCGP2Ja88g
Интересная ошибка при билде комнаты. Я не стал заменять материалы в комнате, а просто создал еще одну и при нажатии кнопки отключаю какую то из них. Так вот если создавать билд с заранее отключенной настроенной комнатой, то появляется странная ошибка с текстурой на стелаже. https://yadi.sk/d/1dw5u93a1wTczg
Обобщая тему с разрешением текстур и настройкой фильтров, можно сделать следующие выводы:
1) Очень важно понимать на каких расстояниях будут смотреть на объект и в зависимости от этого подбирать разрешение текстур и фильтры
2) Если стоит задача добиться максимального качества, то в лодах использовать подходящие текстуры и настройка отключения лодов должна происходить исходя из потери качества текстур
3) При большом воздействии перспективы, низкое разрешение это как раз хорошо.

Пожалуй на этом можно закрывать тему с текстурированием.


Пояснения от Zulllus.

Для остальных, беглое пояснение исследования:
0. Мипмапы - это версии текстуры с разным разрешением, сделанные не только ради экономии памяти ускорителя, но для предотвращения дребезжания точек. Если взять очень большую текстуру и положить ее на очень маленький треугольник (на экране треугольник помещается в 10 точек, а текстура, например, в 100 точек), то ускоритель сам не смешает 100 точек, он тупо возьмет каждую 10 точку с текстуры. Но проблема в том, что когда треугольник поворачивается, то количество точек может плавать от (скажем) 9 до 11, и тогда точки со 2 по 8(9,10) будут отличаться для этих трех версий (с 9, 10 и 11 точками соответственно) и это будет выглядеть как дребезг. А вот если на этот треугольник положить текстуру с 10 точками, то дребезга не будет, т.к. точки будут одинаковые для всех трех версий (почти одинаковые). Вот в этом суть мипмапинга! На ускорителе есть версии текстуры под разный размер треугольника. Когда он шириной 100 - то текстура 100. Когда 10 - 10.
1. Мипмапы нужны, без них никак, но юнити генерит их откровенно плохо. Нужно включать коррекцию границ и фильтр кайзера, получается хуже фотошопа, но что делать.
2. Лучше всего мипмапы делать фотошопом, 10 лет назад другого нормального способа их сделать не было, сейчас вообще нет нормального способа для Юнити. В магазине дополнений есть несколько дополнений, которые позволяют немного улучшить ситуацию, но не сильно.
3. Теперь про фильтрацию. Фильтрация нужна для смешивания мипмапов. Если их нет, то и фильтрация работать не будет. Фильтрация борется с границей переходов между мипмапами, соответственно, отключая ее мы повышаем четкость текстуры до стыка, но зато получаем галимый стык между текущим и следующим мипом.
4. Я не смотрел, что делает юнити с текстурами не кратными двойке, вроде есть галка, которая объясняет, что он может работать с любыми, но что по факту происходит - хз. Но скорее всего не очень важно, является ли текстура кратной 2 (на современных ускорителях проблемы быть не должно). Но есть момент, который реально важный, чем кратность и нужно его понять. Ускоритель из двух мипмапов выбирает тот, что больше подходит короткой стороне. Тут как раз автор рассказывает про проблему пола. Так вот, если короткой стороне нужен самый маленький мип, то текстура будет жутко замыленной. Но чаще всего это получается из-за того, что неправильно сделана UV карта, и берется не 0 мип, а 1 или 2 (о чем говорит автор, но не понимает суть).
5. И еще, может кто-то не понял, мипы всегда отличаются в 2 раза, т.е. между 1024 и 512 нет промежуточных мипов, и ускоритель без фильтрации перепрыгнет с 1024 на 512 щелчком, т.е. если треугольник по горизонтали меньше 1024 точек, то без фильтрации на следующем кадре ускоритель перейдет на текстуру в 512 точек. И именно фильтрация это лечит. Она смешивает по сложному паттерну, включая учет угла между камерой и треугольником. Она СЕЙЧАС бесплатная с точки зрения производительности, поэтому включаем максимальную, трилинейную.

Теперь для тех, кто хочет сделать круто: сделайте свое дополнение, которое будет заменять встроенные в юнити мипмапы на мипмапы, сделанные вручную. Это единственный способ сделать текстуры четче. То, что предлагает автор вообще это не способ. Но если вы не можете сделать свое дополнение, то следуйте следующим советам:
1. Для одного объекта все мипы должны быть одного уровня. Грубо говоря, если у нас текстурирование где-то более растянутое, а где-то более сжатое, то ускорителю фиолетово. Он все равно возьмет не оригинальную текстуру: мип номер 0, а ту, что лучше подходит: мип номер 2, а это значит, что вместо хорошей четкой текстуры мы получим текстуру, сгенерированную убогим алгоритмом юнити из нее.
2. Чтобы понять, какие мипы используются в дополнениях есть бесплатное, которое показывает номер мипа. Номер мипа напрямую не зависит от разрешения экрана, он зависит от текстурной развертки (UV map). И только удивив на экране номер можно подгонять текстуру под это разрешение. Разумеется, нельзя всегда получать идеальный мип, т.к. юнити не дает нарисовать в ручную все мипы, но для (скажем) главного героя от третьего лица можно подобрать лучший мип и параметры этого мипа. Важность этого дополнения еще в том, что вы можете увидеть, что если объект у вас раскрашен разными мипами, но использует одну текстуру - карта UV сделана не правильно.
3. Карту UV нужно делать очень внимательно, это в 10 раз эффективнее, чем следовать советам автора. А чтобы понять, что все правильно, нужны инструменты, которых в юнити нет. Но! Есть дополнения, которые позволяют частично решить проблему, как платные, так и бесплатные. Я их специально не исследовал, рекомендую этим заняться автору. Тогда может будет толк в этой теме.
Последний раз редактировалось sledo 07 мар 2019, 01:55, всего редактировалось 6 раз(а).
sledo
Старожил
 
Сообщения: 811
Зарегистрирован: 05 янв 2014, 15:44

Re: Фотографичность в Unity? Повышаем четкость картинки.

Сообщение sledo 21 окт 2018, 22:32

Свет

В общем и целом, свет можно охарактеризовать как переменная контрастность конечного изображения. Чем больше градиент контрастности, тем более качественное можно получить изображение.

В Юнити есть два варианта освещения - динамическое и заранее вычисленное.

Если использовать только динамическое освещение, то тени будут очень темными, а светлые участки очень светлыми. Юниты это объясняют тем, что в таком случае не просчитывается отраженный свет.
Тут надо немного более подробно изъясниться.
Динамическое освещение, это когда у вас отключены галки на Realtime GI и Baked global illuminationили по какой то причине не была запечена световая карта. при настройках по умолчанию, скорее всего у вас будет очень темная сцена, с практически черными тенями даже в местах где есть интенсивное освещение. Это как раз следствие того что свет не отражается от поверхностей и тем самым дополнительно не освещает их. Никакими ползунками осветления это не исправить, кроме как изменить значение Source со Скайбокса например на Color в окне Lighting, графе Environment lighting. Чем светлее цвет, тем светлее вся сцена.

Соответственно в Юнити это самое худшее по качеству освещение. Долго останавливаться на нем нет смысла, поскольку тут ничего не сделаешь и отсутствуют вообще какие либо настройки (конечно если не учитывать глобальные настройки проекта и сцены).
Юниты говорят, что самое реалистичное освещение это комбинация Real-time lighting и Baked global illumination, или иными словами комбинация запеченных теней и света в реальном времени.
Для того что бы использовать эти типы освещения, надо поставить галку "Статик" у объекта, т.е. сделать их статичными.
Получается, что для всех динамических объектов, будет применяться динамическое освещение, т.е. наихудшее качество света.
Соответственно при использовании комбинации Real-time lighting и Baked global illumination, правильнее будет сказать что используются динамические тени для статического объекта. Следует четко понять, что Real-time lighting это статическое освещение, а не динамическое как иногда многие считают.

Ситуация скверная и Юниты немного подправили ее с помощью light probe. Light probe нужно как раз для того что бы были динамические тени у динамического объекта по качеству немного лучше чем у простого динамического освещения, т.е. что бы отражения света от поверхности обсчитывались и для динамических объектов, необходимо использовать light probe.
Кроме того, на больших сценах или где использование подробных запеченных карт освещения Realtime GI нецелесообразно, для мелких предметов как раз так же можно использовать light probe. Проблема light probe в том, что он может использоваться только локально и так же запекается, а значит не может быть привязан к динамическому объекту, а обсчет происходит только когда динамический объект попадает в зону light probe.
Например есть динамическое помещение, например трейлер. Влияние на его помещение окружающей средой минимально. Соответственно в данный момент, иметь хорошо освещенное внутренне помещение трейлера возможности нет, поскольку запеченная карта освещения будет находиться статично на одном месте, а не передвигаться вместе с трейлером. Соответственно для помещения трейлера будет применяться real-time lighting который просто освещает поверхность без отражения света от нее. Ситуация немного улучшится, когда он войдет в зону действия light probe, однако по сравнению с Realtime GI уровень освещения все равно существенно ниже, да еще и будут появляться артефакты. Сюда добавляем полное отсутствие отражений от воздуха и получаем, что получить хорошо освещенные динамические объекты в Юнити нет ни какой возможности стандартными средствами. Такие дела.

Большое значения разрешения световой карты для Realtime GI, может привести к сбою.
Юниты говорят о том, что высокие разрешения для Realtime GI не нужны. Для больших карт надо делать низкое разрешение и если требуется детальное разрешение то использовать локальные карты. Недостатки освещения компенсировать light probe. Все это нет нужды описывать заново, есть очень подробная инструкция
https://unity3d.com/ru/learn/tutorials/ ... g-clusters
Однако в версии Юнити 2018.2,6 есть странный, скажем так баг. Свет Realtime GI не всегда запекается, даже если вроде как все настроено правильно. Поэтому обязательно надо проверять после обсчета:
1) наличие ошибок (если есть ошибки при обсчете, значит у вас не будет запеченных карт света)
2) Включать слой отображения кластеризации Lit Clustering, в правом верхнем углу окна Scene.
Lit Clustering вам покажет насколько хорошо был произведен обсчет статичных объектов на сцене. В идеале, он должен быть равномерным, без рваных дыр. Добиться этого можно настройками LightmapParameters.
Если же в этом режиме у вас нет ничего на сцене, или же только какие фрагменты, то карта света не была создана или создана только для тех фрагментов которые вы видите. Это очень важно знать и понимать и обязательно проверить.


https://docs.unity3d.com/Manual/class-L ... eters.html
Теперь попробуем разобраться с настройками для Real-time lighting.
Если три параметра Resolution:
1) Indirect resolution
2) Resolution
3) Cluster Resolution
Первый в настройках окна Lighting, другие два в настройках Lightmap Parameters.
Из справки можно сделать вывод, что Resolution из LightmapParameters имеет преимущество над Indirect resolution, однако прямо об этом не говорится.
Для того что бы получать корректные результаты при использовании своих настроек Lightmap Parameters, значение Indirect resolution должно быть равно 1. Это надо запомнить.
Вероятно, значение в поле Indirect resolution необходимо использовать тогда, когда вы используете Defoult настройки поля Lightmap Parameters.
Resolution задает разрешение текселей на метр.
https://docs.unity3d.com/ScriptReferenc ... ution.html
При значении 1 размер кластера будет равен одному метру. При увеличении значения, размер кластера уменьшается, при уменьшении значения размер кластера увеличивается, т.е. при значении 2, размер кластера будет равен 0,5 метру, при значении 0,5, размер кластера будет равен 2 метрам. (немного забегая вперед, при значении 1 у Cluster Resolution)

Третий параметр Cluster Resolution. По названию создается впечатление что это разрешение самого кластера, т.е. кластер бьется как бы на подкластеры которые создают дополнительную детализацию кластера.
Справка говорит что отношение разрешения кластера (разрешение, при котором отраженные источники света рассчитываются внутри кластера) к окончательному разрешению карты освещения.
https://docs.unity3d.com/ScriptReferenc ... ution.html
Разрешение кластера умножается на разрешение карты освещения в реальном времени.
Для расчета корректных результатов окончательного размера кластера, можно следовать следующей формуле: Размер кластера в метрах = 1 / (Resolution * Cluster Resolution), где единица это один метр.

Справка так же настойчиво утверждает что Cluster Resolution это непосредственно разрешение отражаемого света. Это проявляется в виде так называемой "плесени" в местах затенения, т.е. не равномерной тени, а как бы со светлыми проплешинами. Инструментов что бы как то иначе увидеть это разрешение, Юниты не предоставили.

Справка гласит -
Использование очень маленького кластерного разрешения приводит к тому, что свет размазывается по выходным текселям. Большие значения не значительно повышают качество (так как они должны быть усреднены для конечного выходного текселя), но могут привести к ненужному увеличению времени и объема памяти.

При том что максимальное значение Cluster Resolution равно единице, то по факту максимально возможно устанавливаемое значение для Resolution без потери качества, так же должно соответствовать единице. Или проще говоря, размер кластера будет равен одному метру для достижения наилучшего качества. Соответственно нименьшее значение для Resolution будет равно 0,1.

Irradiance Budget - определяет сколько памяти выделяется для одного texel. Ничего сверхестественного тут нет, подробно описывается в https://unity3d.com/ru/learn/tutorials/ ... parameters
Из написанного может сложиться впечатление что этот параметр так же влияет на артефакт "плесень", но лично я подтвердить это не могу. Во всех моих случаях, просто просчет освещения был менее точным, что выражалось в нелогичном распределении затенения.

Irradiance Quality - количество лучей которое генерируется для одного кластера до других объектов.
Так же ничего сложного, подробно описывается в https://unity3d.com/ru/learn/tutorials/ ... parameters

Итог.
Для того что бы получить наилучшее качество освещения, необходимо выставить параметр Indirect resolution на единицу, иметь параметр Resolution не выше единицы, Cluster Resolution выставить так же на единицу, параметры Irradiance Budget и Irradiance Quality поставить на максимум.

Все это приведет к максимально долгому расчету и занимаемой памяти. Для оптимизации, необходимо играть параметрами, а именно:
Indirect resolution должен оставаться без изменений и равен 1.
Resolution не должен быть ниже 0.1 и выше 1. Чем ниже, тем быстрее будут произведены расчеты, меньше использовано памяти, как следствие хуже качество освещения. Например для больших площадей, где у вас допустим один кубик метр на метр, на площади в 100*100, это значение может быть минимально возможным, поскольку смысла в подробном освещении нет никакого.
Cluster Resolution должен находиться в строгой корреляции с Resolution. Изменения должны находиться в минимальном диапазоне. Условно говоря, вы должны запечь карту с равными параметрами Resolution и Cluster Resolution, и только после этого играть параметром Cluster Resolution для достижения наилучшего (при условии конечно значения Resolution ниже 1) или неизменного результата, при более низком значении Cluster Resolution.
Irradiance Budget - тут все немного сложнее. Лучше конечно играть от большего к меньшему, но при больших картах, лучше от меньшего к большему и например остановиться там где кажется что обсчет идет непозволительно долго.
Irradiance Quality - тоже самое.

Билд - https://drive.google.com/open?id=1RCgtB ... MF37qt4tvk
Последний раз редактировалось sledo 07 мар 2019, 03:06, всего редактировалось 2 раз(а).
sledo
Старожил
 
Сообщения: 811
Зарегистрирован: 05 янв 2014, 15:44

Re: Фотографичность в Unity? Повышаем четкость картинки.

Сообщение sledo 21 окт 2018, 22:34

Зарезервировано для расширения темы
sledo
Старожил
 
Сообщения: 811
Зарегистрирован: 05 янв 2014, 15:44

Re: Фотографичность в Unity? Повышаем четкость картинки.

Сообщение sledo 21 окт 2018, 22:35

Зарезервировано для расширения темы
sledo
Старожил
 
Сообщения: 811
Зарегистрирован: 05 янв 2014, 15:44

Re: Фотографичность в Unity? Повышаем четкость картинки.

Сообщение lawson 22 окт 2018, 11:39

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

И не понятно ваше замечание по поводу "типичных" граждан, кто эти люди!?
lawson
UNIверсал
 
Сообщения: 468
Зарегистрирован: 14 сен 2012, 21:20

Re: Фотографичность в Unity? Повышаем четкость картинки.

Сообщение sledo 23 окт 2018, 15:27

lawson писал(а):Поздаравляю Вас, наконец вы смогли привести материал к надлежащему виду, надеюсь вы не будете как всегда критично воспринимать чужие советы, но я бы лучше спарятал видео под спойлеры чтобы было удобней читать. Хотя, в некоторых примерах даже записи не нужны, можно просто два изображения до изменений и после.

Спасибо. Я не часто пишу посты, поэтому конечно опыта создания сразу удобного формата поста у меня нет. Но, я работаю над этим.
К обоснованной критике и предложениям я всегда отношусь положительно. Меня раздражают высказывания типа - "это все овно, а автор удак. -Почему? -Потому.". Ничего поделать с собой не могу.
Насчет спойлеров у меня мысль возникала, но я от нее отказался поскольку мне показалось что будет разрыв в повествовании. Т.е. когда человек что то воспринимает, у него складываются определенные ожидания. В данном случае я предлагаю посмотреть видео с результатами и читатель по идее должен ожидать видео с результатами, но вместо него будет спойлер который скрывает ожидаемую информацию. С другой стороны, практического смысла в видео не много, поскольку технические ограничения не позволяют продемонстрировать разительную разницу в качестве текстуры в предложенных случаях, а они действительно в некоторых случаях очень существенны и видео по сути являются лишь предоставлением факта того что на моем мониторе это было действительно так. Но все же решил что оправдывание ожиданий важнее практичности.
lawson писал(а):Хотя, в некоторых примерах даже записи не нужны, можно просто два изображения до изменений и после.

Картинки надо заливать на какие то хосты, которые хранят их в зависимости от популярности картинки и если популярность низкая, то они отправляются в архив, а значит здесь их не будет. Поэтому для демонстрации я выбрал формат видео. Принципиальной разницы в этом нет. Когда человек займется этим вопросом, то практика покажет то же самое что и видел я. А тут заняться практикой придется и довольно плотно, что бы самому понимать что и когда выгоднее использовать, ибо часто разрешение текстур в 512 дает лучшее качество чем разрешение 1024 в разных условиях, а иногда наоборот.
lawson писал(а):И не понятно ваше замечание по поводу "типичных" граждан, кто эти люди!?

Это среднестатистический человек у которого дома стоит монитор с типичным наиболее популярным максимальным разрешением в 1920x1080. Т.е. типичный гражданин, или другими словами граждан которых большинство, а поскольку все люди граждане какой то страны, то он гражданин. Соответственно если он физически не сможет увидеть более высокое разрешение, а картинка будет на него заточена, то она неизбежно будет терять в качестве и скорее всего больше чем если бы картинка была бы заточена под разрешение его монитора.
sledo
Старожил
 
Сообщения: 811
Зарегистрирован: 05 янв 2014, 15:44

Re: Фотографичность в Unity? Повышаем четкость картинки.

Сообщение lawson 23 окт 2018, 20:13

Меня раздражают высказывания типа - "это все овно, а автор удак. -Почему? -Потому.". Ничего поделать с собой не могу.

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

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

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

Прошу Вас, хватит упоминать ваших личных врагов в тексте, это очень мерзко выглядит.
lawson
UNIверсал
 
Сообщения: 468
Зарегистрирован: 14 сен 2012, 21:20

Re: Фотографичность в Unity? Повышаем четкость картинки.

Сообщение sledo 23 окт 2018, 21:15

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

Честно говоря я не вижу в этом проблемы. Если нажить ctrl+F и набрать интересующее слово, то любой браузер его найдет в тексте. Мне кажется это намного удобнее чем скакать по темам, тем более которые идут в одном ключе. Я думаю что улучшу структуру текста разбив его на части по ключевым словам, которые вынесу на верх по типу оглавления с инструкцией к поиску, что бы человек мог быстро перейти на интересующий его раздел. Я думаю это будет намного лучше, поскольку информации соберется довольно много и ее можно будет использовать как справочную. Я уже сейчас вижу у стандартного освещения 4 разных подхода в Юнити каждый из которых надо раскрыть и подробно описать. Уверяю, тут спойлеры для экономии места, не помогут. Я даже смею надеяться что стандартные возможности движка могут позволить создавать очень правдоподобную игру света в лесном массиве - одно это займет очень много места, если конечно предположения подтвердятся.
lawson писал(а):Складывается ощущение будто вы с каким то пренебрежением относитесь к этим гражданам, так бы и написали: "так как у большинства пользователей установлен такой то монитор поэтому будем использовать такую то технологию". Ну это так мелочи.

Исправлено.
sledo
Старожил
 
Сообщения: 811
Зарегистрирован: 05 янв 2014, 15:44

Re: Фотографичность в Unity? Повышаем четкость картинки.

Сообщение sledo 27 дек 2018, 18:30

Обновление темы.

В связи с недавно вышедшим обновлением Таркова, сделал билд где можно наглядно увидеть разницу между дефолтными настройками текстур с не подобранным разрешением и настроенной комнатой. Вообще конечно надо было его сделать намного раньше, но как всем нам известно, время, это именно то чего вечно не хватает. Выкраил пару часиков на это благое дело.
Пример полностью показывает разницу между двумя подходами и демонстрирует насколько слабо Юнити работает с текстурами. Так же он демонстрирует артефакты зернистости и проигрыш в качестве перед дефолтными настройками. Надеюсь теперь даже у самых ярых скептиков не останется сомнений в том что подбор разрешения текстур и настройка самих текстур является критически важным аспектом в графическом качестве игр.
Примеры ошибок:
1) Книги, дверь и фото кошки внизу у стенки, имеют артефакты зернистости. Разрешение текстур кошки 256, книг 1024, дверь 2048. Ошибки при создании перспективы. Разрешение надо снижать, либо все замыливать.
2) Стол имеет большую четкость как раз при дефолтных настройках текстуры, при том что разрешение текстур у них одинаковое. Ошибка подбора разрешения текстуры.
Сам билд - https://yadi.sk/d/w50gX9YszV1kNw
sledo
Старожил
 
Сообщения: 811
Зарегистрирован: 05 янв 2014, 15:44

Re: Фотографичность в Unity? Повышаем четкость картинки.

Сообщение sledo 30 дек 2018, 04:57

Обновление темы.

Еще один билд, который демонстрирует сохранение качества текстуры с ростом расстояния, посредством использования верно подобранного разрешения. Так же потеря качества при использовании текстуры высокого разрешения на расстоянии. https://yadi.sk/d/MnBetCGP2Ja88g
Интересная ошибка при билде комнаты. Я не стал заменять материалы в комнате, а просто создал еще одну и при нажатии кнопки отключаю какую то из них. Так вот если создавать билд с заранее отключенной настроенной комнатой, то появляется странная ошибка с текстурой на стелаже. https://yadi.sk/d/1dw5u93a1wTczg
Обобщая тему с разрешением текстур и настройкой фильтров, можно сделать следующие выводы:
1) Очень важно понимать на каких расстояниях будут смотреть на объект и в зависимости от этого подбирать разрешение текстур и фильтры
2) Если стоит задача добиться максимального качества, то в лодах использовать подходящие текстуры и настройка отключения лодов должна происходить исходя из потери качества текстур
3) При большом воздействии перспективы, низкое разрешение это как раз хорошо.

Пожалуй на этом можно закрывать тему с текстурированием.
sledo
Старожил
 
Сообщения: 811
Зарегистрирован: 05 янв 2014, 15:44

Re: Фотографичность в Unity? Повышаем четкость картинки.

Сообщение Zulllus 28 фев 2019, 11:18

Эх. Изучаю Юнити, прочитал эту ахинею. Ужаснулся. Автор, ты может и не плохой исследователь, но зачем это все было исследовать, если ты не понимаешь принципа работы графического ускорителя с текстурами?

Для остальных, беглое пояснение исследования:
0. Мипмапы - это версии текстуры с разным разрешением, сделанные не только ради экономии памяти ускорителя, но для предотвращения дребезжания точек. Если взять очень большую текстуру и положить ее на очень маленький треугольник (на экране треугольник помещается в 10 точек, а текстура, например, в 100 точек), то ускоритель сам не смешает 100 точек, он тупо возьмет каждую 10 точку с текстуры. Но проблема в том, что когда треугольник поворачивается, то количество точек может плавать от (скажем) 9 до 11, и тогда точки со 2 по 8(9,10) будут отличаться для этих трех версий (с 9, 10 и 11 точками соответственно) и это будет выглядеть как дребезг. А вот если на этот треугольник положить текстуру с 10 точками, то дребезга не будет, т.к. точки будут одинаковые для всех трех версий (почти одинаковые). Вот в этом суть мипмапинга! На ускорителе есть версии текстуры под разный размер треугольника. Когда он шириной 100 - то текстура 100. Когда 10 - 10.
1. Мипмапы нужны, без них никак, но юнити генерит их откровенно плохо. Нужно включать коррекцию границ и фильтр кайзера, получается хуже фотошопа, но что делать.
2. Лучше всего мипмапы делать фотошопом, 10 лет назад другого нормального способа их сделать не было, сейчас вообще нет нормального способа для Юнити. В магазине дополнений есть несколько дополнений, которые позволяют немного улучшить ситуацию, но не сильно.
3. Теперь про фильтрацию. Фильтрация нужна для смешивания мипмапов. Если их нет, то и фильтрация работать не будет. Фильтрация борется с границей переходов между мипмапами, соответственно, отключая ее мы повышаем четкость текстуры до стыка, но зато получаем галимый стык между текущим и следующим мипом.
4. Я не смотрел, что делает юнити с текстурами не кратными двойке, вроде есть галка, которая объясняет, что он может работать с любыми, но что по факту происходит - хз. Но скорее всего не очень важно, является ли текстура кратной 2 (на современных ускорителях проблемы быть не должно). Но есть момент, который реально важный, чем кратность и нужно его понять. Ускоритель из двух мипмапов выбирает тот, что больше подходит короткой стороне. Тут как раз автор рассказывает про проблему пола. Так вот, если короткой стороне нужен самый маленький мип, то текстура будет жутко замыленной. Но чаще всего это получается из-за того, что неправильно сделана UV карта, и берется не 0 мип, а 1 или 2 (о чем говорит автор, но не понимает суть).
5. И еще, может кто-то не понял, мипы всегда отличаются в 2 раза, т.е. между 1024 и 512 нет промежуточных мипов, и ускоритель без фильтрации перепрыгнет с 1024 на 512 щелчком, т.е. если треугольник по горизонтали меньше 1024 точек, то без фильтрации на следующем кадре ускоритель перейдет на текстуру в 512 точек. И именно фильтрация это лечит. Она смешивает по сложному паттерну, включая учет угла между камерой и треугольником. Она СЕЙЧАС бесплатная с точки зрения производительности, поэтому включаем максимальную, трилинейную.

Теперь для тех, кто хочет сделать круто: сделайте свое дополнение, которое будет заменять встроенные в юнити мипмапы на мипмапы, сделанные вручную. Это единственный способ сделать текстуры четче. То, что предлагает автор вообще это не способ. Но если вы не можете сделать свое дополнение, то следуйте следующим советам:
1. Для одного объекта все мипы должны быть одного уровня. Грубо говоря, если у нас текстурирование где-то более растянутое, а где-то более сжатое, то ускорителю фиолетово. Он все равно возьмет не оригинальную текстуру: мип номер 0, а ту, что лучше подходит: мип номер 2, а это значит, что вместо хорошей четкой текстуры мы получим текстуру, сгенерированную убогим алгоритмом юнити из нее.
2. Чтобы понять, какие мипы используются в дополнениях есть бесплатное, которое показывает номер мипа. Номер мипа напрямую не зависит от разрешения экрана, он зависит от текстурной развертки (UV map). И только удивив на экране номер можно подгонять текстуру под это разрешение. Разумеется, нельзя всегда получать идеальный мип, т.к. юнити не дает нарисовать в ручную все мипы, но для (скажем) главного героя от третьего лица можно подобрать лучший мип и параметры этого мипа. Важность этого дополнения еще в том, что вы можете увидеть, что если объект у вас раскрашен разными мипами, но использует одну текстуру - карта UV сделана не правильно.
3. Карту UV нужно делать очень внимательно, это в 10 раз эффективнее, чем следовать советам автора. А чтобы понять, что все правильно, нужны инструменты, которых в юнити нет. Но! Есть дополнения, которые позволяют частично решить проблему, как платные, так и бесплатные. Я их специально не исследовал, рекомендую этим заняться автору. Тогда может будет толк в этой теме.
Zulllus
UNец
 
Сообщения: 1
Зарегистрирован: 28 фев 2019, 10:12

Re: Фотографичность в Unity? Повышаем четкость картинки.

Сообщение seaman 28 фев 2019, 15:06

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

Unity поддерживает импорт dds текстур, в которых есть mipmap. Так что дополнение по сути не нужно, нужно просто мипмпы сделанные вручную загонять в dds.
Одно замечание:
You can import Textures from DDS files, but only DXT, BC compressed formats, or uncompressed pixel formats are supported.

Там в dds есть несколько разных типов - поддерживаются не все.
Второе замечание.
Я правда давно пробовал, но ранее если в dds были не все мипмапы, то юнити их не воспринимал.
seaman
Адепт
 
Сообщения: 7748
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Фотографичность в Unity? Повышаем четкость картинки.

Сообщение sledo 07 мар 2019, 01:48

Обновление темы.
Свет

В общем и целом, свет можно охарактеризовать как переменная контрастность конечного изображения. Чем больше градиент контрастности, тем более качественное можно получить изображение.

В Юнити есть два варианта освещения - динамическое и заранее вычисленное.

Если использовать только динамическое освещение, то тени будут очень темными, а светлые участки очень светлыми. Юниты это объясняют тем, что в таком случае не просчитывается отраженный свет.
Тут надо немного более подробно изъясниться.
Динамическое освещение, это когда у вас отключены галки на Realtime GI и Baked global illuminationили по какой то причине не была запечена световая карта. при настройках по умолчанию, скорее всего у вас будет очень темная сцена, с практически черными тенями даже в местах где есть интенсивное освещение. Это как раз следствие того что свет не отражается от поверхностей и тем самым дополнительно не освещает их. Никакими ползунками осветления это не исправить, кроме как изменить значение Source со Скайбокса например на Color в окне Lighting, графе Environment lighting. Чем светлее цвет, тем светлее вся сцена.

Соответственно в Юнити это самое худшее по качеству освещение. Долго останавливаться на нем нет смысла, поскольку тут ничего не сделаешь и отсутствуют вообще какие либо настройки (конечно если не учитывать глобальные настройки проекта и сцены).
Юниты говорят, что самое реалистичное освещение это комбинация Real-time lighting и Baked global illumination, или иными словами комбинация запеченных теней и света в реальном времени.
Для того что бы использовать эти типы освещения, надо поставить галку "Статик" у объекта, т.е. сделать их статичными.
Получается, что для всех динамических объектов, будет применяться динамическое освещение, т.е. наихудшее качество света.
Соответственно при использовании комбинации Real-time lighting и Baked global illumination, правильнее будет сказать что используются динамические тени для статического объекта. Следует четко понять, что Real-time lighting это статическое освещение, а не динамическое как иногда многие считают.

Ситуация скверная и Юниты немного подправили ее с помощью light probe. Light probe нужно как раз для того что бы были динамические тени у динамического объекта по качеству немного лучше чем у простого динамического освещения, т.е. что бы отражения света от поверхности обсчитывались и для динамических объектов, необходимо использовать light probe.
Кроме того, на больших сценах или где использование подробных запеченных карт освещения Realtime GI нецелесообразно, для мелких предметов как раз так же можно использовать light probe. Проблема light probe в том, что он может использоваться только локально и так же запекается, а значит не может быть привязан к динамическому объекту, а обсчет происходит только когда динамический объект попадает в зону light probe.
Например есть динамическое помещение, например трейлер. Влияние на его помещение окружающей средой минимально. Соответственно в данный момент, иметь хорошо освещенное внутренне помещение трейлера возможности нет, поскольку запеченная карта освещения будет находиться статично на одном месте, а не передвигаться вместе с трейлером. Соответственно для помещения трейлера будет применяться real-time lighting который просто освещает поверхность без отражения света от нее. Ситуация немного улучшится, когда он войдет в зону действия light probe, однако по сравнению с Realtime GI уровень освещения все равно существенно ниже, да еще и будут появляться артефакты. Сюда добавляем полное отсутствие отражений от воздуха и получаем, что получить хорошо освещенные динамические объекты в Юнити нет ни какой возможности стандартными средствами. Такие дела.

Большое значения разрешения световой карты для Realtime GI, может привести к сбою.
Юниты говорят о том, что высокие разрешения для Realtime GI не нужны. Для больших карт надо делать низкое разрешение и если требуется детальное разрешение то использовать локальные карты. Недостатки освещения компенсировать light probe. Все это нет нужды описывать заново, есть очень подробная инструкция
https://unity3d.com/ru/learn/tutorials/ ... g-clusters
Однако в версии Юнити 2018.2,6 есть странный, скажем так баг. Свет Realtime GI не всегда запекается, даже если вроде как все настроено правильно. Поэтому обязательно надо проверять после обсчета:
1) наличие ошибок (если есть ошибки при обсчете, значит у вас не будет запеченных карт света)
2) Включать слой отображения кластеризации Lit Clustering, в правом верхнем углу окна Scene.
Lit Clustering вам покажет насколько хорошо был произведен обсчет статичных объектов на сцене. В идеале, он должен быть равномерным, без рваных дыр. Добиться этого можно настройками LightmapParameters.
Если же в этом режиме у вас нет ничего на сцене, или же только какие фрагменты, то карта света не была создана или создана только для тех фрагментов которые вы видите. Это очень важно знать и понимать и обязательно проверить.


https://docs.unity3d.com/Manual/class-L ... eters.html
Теперь попробуем разобраться с настройками для Real-time lighting.
Если три параметра Resolution:
1) Indirect resolution
2) Resolution
3) Cluster Resolution
Первый в настройках окна Lighting, другие два в настройках Lightmap Parameters.
Из справки можно сделать вывод, что Resolution из LightmapParameters имеет преимущество над Indirect resolution, однако прямо об этом не говорится.
Для того что бы получать корректные результаты при использовании своих настроек Lightmap Parameters, значение Indirect resolution должно быть равно 1. Это надо запомнить.
Вероятно, значение в поле Indirect resolution необходимо использовать тогда, когда вы используете Defoult настройки поля Lightmap Parameters.
Resolution задает разрешение текселей на метр.
https://docs.unity3d.com/ScriptReferenc ... ution.html
При значении 1 размер кластера будет равен одному метру. При увеличении значения, размер кластера уменьшается, при уменьшении значения размер кластера увеличивается, т.е. при значении 2, размер кластера будет равен 0,5 метру, при значении 0,5, размер кластера будет равен 2 метрам. (немного забегая вперед, при значении 1 у Cluster Resolution)

Третий параметр Cluster Resolution. По названию создается впечатление что это разрешение самого кластера, т.е. кластер бьется как бы на подкластеры которые создают дополнительную детализацию кластера.
Справка говорит что отношение разрешения кластера (разрешение, при котором отраженные источники света рассчитываются внутри кластера) к окончательному разрешению карты освещения.
https://docs.unity3d.com/ScriptReferenc ... ution.html
Разрешение кластера умножается на разрешение карты освещения в реальном времени.
Для расчета корректных результатов окончательного размера кластера, можно следовать следующей формуле: Размер кластера в метрах = 1 / (Resolution * Cluster Resolution), где единица это один метр.

Справка так же настойчиво утверждает что Cluster Resolution это непосредственно разрешение отражаемого света. Это проявляется в виде так называемой "плесени" в местах затенения, т.е. не равномерной тени, а как бы со светлыми проплешинами. Инструментов что бы как то иначе увидеть это разрешение, Юниты не предоставили.

Справка гласит -
Использование очень маленького кластерного разрешения приводит к тому, что свет размазывается по выходным текселям. Большие значения не значительно повышают качество (так как они должны быть усреднены для конечного выходного текселя), но могут привести к ненужному увеличению времени и объема памяти.

При том что максимальное значение Cluster Resolution равно единице, то по факту максимально возможно устанавливаемое значение для Resolution без потери качества, так же должно соответствовать единице. Или проще говоря, размер кластера будет равен одному метру для достижения наилучшего качества. Соответственно нименьшее значение для Resolution будет равно 0,1.

Irradiance Budget - определяет сколько памяти выделяется для одного texel. Ничего сверхестественного тут нет, подробно описывается в https://unity3d.com/ru/learn/tutorials/ ... parameters
Из написанного может сложиться впечатление что этот параметр так же влияет на артефакт "плесень", но лично я подтвердить это не могу. Во всех моих случаях, просто просчет освещения был менее точным, что выражалось в нелогичном распределении затенения.

Irradiance Quality - количество лучей которое генерируется для одного кластера до других объектов.
Так же ничего сложного, подробно описывается в https://unity3d.com/ru/learn/tutorials/ ... parameters

Итог.
Для того что бы получить наилучшее качество освещения, необходимо выставить параметр Indirect resolution на единицу, иметь параметр Resolution не выше единицы, Cluster Resolution выставить так же на единицу, параметры Irradiance Budget и Irradiance Quality поставить на максимум.

Все это приведет к максимально долгому расчету и занимаемой памяти. Для оптимизации, необходимо играть параметрами, а именно:
Indirect resolution должен оставаться без изменений и равен 1.
Resolution не должен быть ниже 0.1 и выше 1. Чем ниже, тем быстрее будут произведены расчеты, меньше использовано памяти, как следствие хуже качество освещения. Например для больших площадей, где у вас допустим один кубик метр на метр, на площади в 100*100, это значение может быть минимально возможным, поскольку смысла в подробном освещении нет никакого.
Cluster Resolution должен находиться в строгой корреляции с Resolution. Изменения должны находиться в минимальном диапазоне. Условно говоря, вы должны запечь карту с равными параметрами Resolution и Cluster Resolution, и только после этого играть параметром Cluster Resolution для достижения наилучшего (при условии конечно значения Resolution ниже 1) или неизменного результата, при более низком значении Cluster Resolution.
Irradiance Budget - тут все немного сложнее. Лучше конечно играть от большего к меньшему, но при больших картах, лучше от меньшего к большему и например остановиться там где кажется что обсчет идет непозволительно долго.
Irradiance Quality - тоже самое.



Zulllus писал(а):Эх. Изучаю Юнити, прочитал эту ахинею. Ужаснулся. Автор, ты может и не плохой исследователь, но зачем это все было исследовать, если ты не понимаешь принципа работы графического ускорителя с текстурами?

Все это нужно что бы предоставить людям информацию, которую они без проведения этих же тестов, не получат.
Я задался целью улучшить картинку стандартными средствами из того что есть. Это у меня с успехом получилось и полностью подтвержает предложенные постулаты. Возможно, я нарушил все мыслимые и не мыслимые правила, но факт в том, что картинка имеет высокую четкость по сравнению с дефолтной, а повторив мои действия, другие люди получат тот же результат в своих проектах. А если не получат, то имеют возможность выяснить причину. Возможно, картинку можно улучшить еще больше использовав дополнительные инструменты вне Юнити, или вовсе написав движок заново где все будет предельно правильно и идеально ложиться под общепринятые понятия, но это выходит за рамки преложенной тематики.
Если у вас есть желание, я не против - проведите исследования, зафиксируйте метод проведения исследования и его результаты, сделайте вывод и предоставьте наглядный билд. В свою очередь я это включу в основную тему что бы люди могли увидеть эту информацию в одном месте.
Незнаю куда вы смотрели, но упор я делал на разрешении текстур, попутно протестировав настройки Юнити, зафиксировав результаты, предложив алгоритм действий. Я ни где не утверждал что "Мипмапы ̶в̶о̶о̶б̶щ̶е̶ ̶н̶е̶ нужны". Я утверждаю что их использование в рамках стандартных настроек Юнити, в некоторых случаях снижают качество, что наглядно доказал.

Дело в том, что я не ограничен правилами.
sledo
Старожил
 
Сообщения: 811
Зарегистрирован: 05 янв 2014, 15:44


Вернуться в Уроки

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 1