Фотографичность в Unity? Повышаем четкость картинки.
Добавлено: 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 раз эффективнее, чем следовать советам автора. А чтобы понять, что все правильно, нужны инструменты, которых в юнити нет. Но! Есть дополнения, которые позволяют частично решить проблему, как платные, так и бесплатные. Я их специально не исследовал, рекомендую этим заняться автору. Тогда может будет толк в этой теме.
Тут же становится ясно, почему происходит подмена понятий фотографичности и фотореалистичности. Для того что бы добиться фотографической копии реального мира проще всего использовать виртуальные копии этого реально мира в качестве игровых объектов. Т.е. когда человек возьмет фотографию в качестве текстуры объекта, а сам объект будет иметь точную копию реального объекта, то создается основа для художественного направления - фотореалистичность и уже картинку можно назвать фотореалистичной. Обычно проблема всегда заключалась в том что добиться качественной картинки не всегда получалось и если брать реалии Юнити, то в подавляющем большинстве случаев это была замыленная игрушечная графика. То что здесь будет описываться, призвано убрать эти искажения и показать высокую четкость, и естественность окружения.
И если при использовании фотореалистичной графики, применять приемы для достижения фотографичности, то получится приближенная копия реального мира. В этом и кроется начало подмены понятий, когда под фотореалистичностью начинают подразумевать фотографическую точность исполнения виртуального мира. Что конечно заблуждение.
В ходе детального изучения вопроса стало ясно, что знание приемов фотографичности крайне важны для художника, для того что бы он мог максимально точно изобразить то что задумал (тут у многих может возникнуть логическое противоречие между ранее предложенными постулатами. Но я не стану вносить правки и на это есть свои причины). Тонкое место тут в том, что при использовании фотореалистичных текстур вы уже будете добиваться большой фотографической точности, что конечно достаточно скверно для вас, как для художника. Высокая фотографическая точность, может перекрывать ваши творческие усилия и они могут попасть в тень от восхищения схожести картинки с реальным миром. Отсюда получается что чем менее фотореалистичны будут игровые объекты, тем более полезны фотографические приемы, тем точнее вы сможете передать то, что задумали. Отсюда же становится ясно основное будущее игр.
С другой стороны, это может быть плюсом, когда человек уже привыкнет к картинке и начнет замечать именно заложенные в ней творческие приемы, что конечно может открыть для игрока ваш мир заново. А это многого стоит.
В свою очередь, если вы создаете другой мир, например где вы решили сделать небо красным, облака желтыми, деревья зелеными, а землю синей (в общем ужас эпилептиков), то высокая четкость изображения даст вам возможность передать игроку практически все так как вы задумали, без учета того что все замылится и замультяшится. Плюс у вас в руках появятся полезные инструменты для того что бы замылить и замультяшить именно так, как вы хотите.
В некоторых случаях я отделю теорию от практики. Теория это то что работает всегда, не важно где вы ее применяете. Практика это то как теория работает в конкретном месте, в данном случае на Юнити. Теория в данном случае, это примерно то же как и закон о сохранении энергии, зная и понимая который вы можете объяснять и прогнозировать практически любые события в жизни.
Фотографичность
Небольшое предисловие.
Расследование показало, что как такой дисциплины по фотографичности нет. По факту это то что путают с художественной дисциплиной "фотореалистичность", а именно - просто набор приемов которые могут серьезно отличаться друг от друга в зависимости от условий создания изображений высокой четкости в различных условиях среды, которые максимально копируют что либо. Это чисто технические моменты и думать об этом надо только с точки зрения механики. Определенную пользу фотографичность может принести и даже в зависимости от условий поставленной задачи, принести серьезную пользу. В частности существенное повышение качества конечного изображения, его честкости, выявление технических недостатков инструментов и прочее.
Надо для себя понять, что будь вы художник который создает пока несущестующий мир, или программист который использует строгую логику, для достижения конечного результата вы используете инструменты -все с помощью чего вы творите, это инструменты для вашей работы. Нет ни каких строгих правил, нет ни каких ограничений. Все эти правила и ограничения сидят у вас в голове и вы сами себя ограничиваете. Если для достижения положительного результата вам надо использовать фотографичность - используйте. Это точно такой же инструмент, как и все остальное. Просто, не увлекайтесь этим и уж тем более не ставьте его в правило. У вас есть лишь технические ограничения с которыми придется считаться, но это лишь значит что в большинстве случаев вы не сможете решить проблему в лоб и только.
Так же крайне важно понять что человек не способен сразу понимать что хорошо, а что плохо. Это понятия относительные и мыслим мы именно относительно чего либо. До тех пор пока вы не увидите что такое хорошо, вы не сможете понять что такое плохо и наоборот. Поэтому можно и нужно ошибаться (но лучше конечно учиться на чужих ошибках), делать плохие вещи и стремиться к лучшему, если вы хотите стать истинным профессионалом. Отсюда же вытекает, что если выдостигли как вы считаете совершенства, то развиваться сможете только в худшее. Позволю себе небольшое отступление, для того что бы привести аналогию. Не так давно был отснят очередной эпизод Звездных войн - Последние джедаи. Мне нравятся сказки и на мой субъективный взгляд ничего стоющего в этой картине нет кроме одного. Примерно в конце фильма когда главные герои сражаются друг с другом, каждый из них пытается перетянуть другого на свою сторону силы и что самое интересное, они оба правы в своих взглядах. Что самое забавное и что вообще лишает смысла всю Вселенную Звездных войн, это то что тут они прямо говорят о том что не может быть только добро или зло, они могут существовать только вместе и всегда будут уравновешенны друг другом. Т.е. кто бы не победил, всегда найдется тот кто перейдет на темную сторону или на светлую сторону, просто по определению. Для баланса. Как бы не банален был сюжет, но эта сцена прямо показывает что, что бы узнать что такое добро, нужно что бы было зло (привет атеистам и их игнорированию Библии с эпизодом райского дерева познания добра и зла). Отсюда же выходит - если не будет зла, то и добра, тоже не будет.
Так вот - фотографичность с точки зрения изобразительного творчества - это абсолютное зло. Однако не познав его, вы не сможете узнать что такое истинное творчество.
Так же следует понимать что все предоставленные демонстрации лишь плашки которые показывают возможности вашего творчества.
Теперь приступим.
Определимся, что это такое фотографичность.
Конкретно к слову фотографичность определения я не нашел. Везде даются ссылки на какое то другое слово которое в конце концов приводит к
ФОТОГРАФИГЧЕСКИЙ, фотографическая, фотографическое.
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 раз эффективнее, чем следовать советам автора. А чтобы понять, что все правильно, нужны инструменты, которых в юнити нет. Но! Есть дополнения, которые позволяют частично решить проблему, как платные, так и бесплатные. Я их специально не исследовал, рекомендую этим заняться автору. Тогда может будет толк в этой теме.