Перейти к содержимому

Что такое тексель в 3д

  • автор:

Texels, Texel Density and Pixels.

When it comes to texturing, one concept which seems to elude the comprehension of CG artists is texel density. I found it difficult myself to wrap my head around it at first. And then after using textures over and over again, the whole thing became easier to grasp. Texels are nothing more than pixels from an image being used as a texture. Hence the name is the contraction of TEXture and pixEL. The amount of texels tells us how big or small the image applied as a texture is. The word applying is very important here as this is where the difference between pixels and texels lies when we deal with textures. Somehow texels are decoupled from pixels since we are not necessarily using all of the pixels from the image we use as a texture. So to sum up we could say that the texels are the pixels from our image texture that are actually being used (applied to an object through a shader, or material…) For those out there who did use trim sheets you can readily relate to this concept since you do know that time and time again depending on how a trim sheet has been designed you might actually only use small parts of it. A 2K (2048 x 2048 pixels) trim sheet might allow us to add details to a geometry (as decals for instance) by only using 256 x 256 pixels out of the 2K overall resolution. Those 256 x 256 pixels will then be called texels when talking about the mesh they’ve been applied onto. So, what is texel density then? Well, texel density is the number of texels used per unit of geometry (the choice of a unit doesn’t really matter, it can be a unit in imperial, metric, or whichever system)
Let’s take an example.

In the image above both cubes use the same textures but have a different texel density: the cube on the right has a higher texel density. What this means is that if we take only into consideration the planes facing us (that is only one side of each cube) and know that we are using a 1K texture. The plane on the left and the one on the right both holds the same amount of texels but they are not the same size. If we say that the plane on the right-hand side is 1 unit wide then we have 1024 texels per unit and we can surmise that on the left-hand side we have 512 (1024/2) texels per unit. Now as one can readily tell having different texel densities may clearly show throughout a scene. It might be the desired effect though, but knowing what is actually going on goes a long way. Those two cubes could be actually stuck together as a whole (as a wall too) and the gap above the smallest one could be a window opening for instance. Suddenly having big and small bricks on the (seemingly) very same wall might look a bit funny. So texel density is paramount when dealing with textures within a scene and you want to make sure that textures are consistent throughout. Sticking to one texel density will help us do just that as can be seen in the image below: bricks are now the same size as both cubes use the same texel density.

Texel density should be regarded as a more precise way to measure textures within a scene. In order to have a consistent approach to texturing a scene using the texel density will, as a gauge, allow us to know how textures, as related to geometry, will behave. The texel density is more centred upon texture sizes and how they relate to objects and their respective sizes. This being said texel density as a tool can help us improve the look of our outputs whichever they are but texel density in itself doesn’t deal chiefly with output quality. The seemingly opaque nature of the texel density concept might actually be related to this mis-association. The equation high texel density = high-quality output is too much of a shortcut and a bad texture (you’ll find many reasons for that) will never render well even though we’re using an 8K resolution texture.

Yet there is a link between texel density and final output. If you look at the image below, you’ll see that the further away we are from the camera the lower the texel density (those planes are all the same size) and yet the quality is unaffected. The reason for that is to be found in the relation there is between texel density and render output resolution.

As it is indicated above the texel density is not the same for each plane. Although I did say above that using the same texel density allowed for consistency within a scene, in our previous case we saw that to maintain the same texel density we did change the scale of the texture through mapping. Here the situation is quite different: the textures have kept the scale of the brick pattern the same size (the planes used as walls being the same size too, so the scale of the brick patterns must remain the same). What did change, though, is the output resolution of the textures exported from Substance Designer. As seen in the image above, the resolution decreases as we move forward and yet there’s no loss of quality in the output: as we move forward and away from the camera the meshes being texture become smaller and smaller and hence occupy a very small portion of the screen. Based on the image that you can see above if you look at the grey wall facing the camera which lies in the background you can see that it encompasses a very small area (285 x 285 pixels roughly) of the entire image, in fact, that’s less than 4% of the total resolution of the image. We could use an 8K texture for this wall but that will be overkill and it will, nevertheless, only be rendered as 285×285 pixels. So, in that very case, and if we don’t have to get anywhere close to this wall (I’ll explain why below) a 512 pixels texture will do the trick of saving memory along the way. If we do get closer and closer to this wall then the matter will be different.

Let’s take a 1K image texture and an ideal 1K output resolution (a square image of 1024 x 1024). If this texture is applied onto a plane mesh in our scene and that plane fits perfectly within our frame then we could say that we have a 1:1 ratio texture resolution to screen resolution. For those of you who do use Photoshop you can relate to this concept by actually using View/100% (Ctr+1, Command+1). When you take whichever image and open it in Photoshop, if you press Ctr+1 you see the image as a 1:1 monitor pixel-to-image pixel ratio. So, if you get a picture whose dimensions are 1920×1080 the picture seen as 100% in Photoshop should fit perfectly on your screen (that is if you remove the rulers) provided the resolution of your screen is 1920×1080. When we apply this concept to image texture size to output resolution, we have two different situations that can be represented using the same ratio notion (and notation). If the texture size increases (or the output resolution decreases) x:1 and similarly if the texture size decreases (or the output resolution increases) 1:x. In the image above the walls at the front are a lot more prominent and use more of the output image overall area as compared to those at the back but we cannot see any difference whereas the image below shows a decrease in quality as we move from left to right (from 2K to .5K)

density. When we were looking at those walls being parallel to the camera axis, the perspective made sure that the walls in the background occupied less screen space (or output resolution pixels) than those in the foreground and hence they look better than when those different texel densities for the walls are facing the camera (perpendicular to the camera axis). In the same way, coming close to an object within a scene somehow increase this 1:x ratio. How close we can get to an object will depend on our texel density in that regard but it will be easy to work out now that we know how texel density works. Keeping always in mind that ultimately the texel density you’d like to use is dictated by the screen resolution the scene is aimed at will always be of great help. For images aimed at a 1920×1080 screen resolution, 2K textures and the texel density you’ll derive from them should do the trick.

I had my lightbulb moment as I was texturing a floor and wanted to use an image texture for roughness in order to give my floor a nice look and feel. I realized that the result was far from ok even though I had been successful with this very texture in the past (tend to reuse the same across projects). I could not figure out what was wrong: this was baffling. Then I changed the texel density (increased the resolution of my texture while the mesh kept its size everything else being equal) and it was suddenly fine again. What had changed was that the distance camera to mesh had gotten shorter and the angle of the camera relative to the ground had changed giving my ground more space within the frame and all of a sudden what was once ok was not anymore. This is when I realized there was this connection between different elements within my scenes and that I could not just take one texture and reuse it without giving the whole process some thought.

I hope this article will help someone somehow to avoid scratching his/her head for days on end.

Какой взять тексель и сколько текстурных групп?

Плотность текселя (Texel Density, далее TD) величина, которая показывает сколько пикселей будет содержать размерная единица модели px/см. Чем больше значение, тем больше пикселей будет выделено на отрисовку деталей, соответственно тем выше качество картинки. Обратной стороной высокого качества является высокий вес текстур, и как следствие движок будет дольше просчитывать отрисовку. Так вот чтобы вес текстур не был лишним, значение TD надо подбирать.

Выбор значения TD зависит от многих факторов, но для новичка достаточно этих:

1. Расстояние, с которого будет показана модель. Модель показана только целиком, общий, дальний план, то можешь сэкономить и взять от 4 до 10 px\см, тут чем дальше объект от камеры, тем меньше берешь значение. Если собираешься делать крупным планом рендеры модели, то TD лучше взять повыше, от 10 до 15 px\см, но тогда будет больше текстурных групп, тяжелее будет идти процесс текстурирования. Примеры:

2. Уровень детализации. Если модель имеет много мелких деталей и нужно чтобы они были как следует прорисованы, бери TD повыше, на 3-4 px/см, не забывая про расстояние до камеры. Если есть возможность, то стоит собрать мелкие детали в отдельную текстурную группу и взять высокий TD, а остальные группы сделать с меньшим TD. Если деталей совсем мало, на нормальную UV не наберется, то можно в общей развертке с нормальным TD перед упаковкой апскейлить нужные острова (к примеру увеличить в два раза), чтобы только для них поднять TD.

3. Акценты. То, что будет в первую очередь привлекать внимание зрителя, стоит также отнести в группу с более высоким TD. Например лицо (тут ещё и детализация), фары авто, приборная панель и т.д. Днище автомобиля едва ли будет видно на твоей презентации, его напротив стоит отнести в отдельную группу, где TD будет в районе 3 px/см. Тоже самое касается задних стенок многих стационарных объектов, которые не будут показаны. Если у тебя сцена, где есть главная модель — центр внимания зрителя, и есть пропсы, то можно сэкономить, сделав пропсы с TD меньшим на 2-4 px/см, да и как правило, пропсы будут дальше расположены чем главный объект, что ещё позволяет уменьшить TD. Тоже самое касается всего окружения. Примеры далее будут.

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

Делать это лучше после того, как будет готова подетальная развертка, чтобы было понятно какие элементы будут оверлапнуты. В гугле не нашел формулу, но имея понимание, труда вывести самому не составило:

где S — площадь поверхности геометрии за вычетом оверлапнутых частей, см2;

a — сторона текстуры (..1024, 2048, 4096, 8192..), px;

TD — плотность текселя для которой ищем количество текстурных групп, px/см;

% — доля заполнения UV пространства после упаковки, так как до упаковки ты ещё не знаешь насколько плотно упакуешь, то для расчёта можно взять среднее наиболее вероятное значение — 0,7;

n — искомое количество текстурных сетов, шт.

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

Методика ниже может кому-то показаться сложной, но это не так — стоит один раз попробовать и потом этот процесс будет занимать несколько минут. Сложный взят пример с 4етыремя разными TD, чаще всего TD один на всю модель и всё вообще очень просто.

1) Есть Jeep Wrangler, сначала хочу убедиться, что его размеры соответствуют правде, иначе расчёт даст фейковые значения.

Всё верно, 3,8 м длина кузова. Выделяю всё, применяю скейл.

2) Делаю копию, удаляю (не применяю!) все зеркала и прочие модификаторы, которые остались для оверлапов на UV:

3) Группирую предварительно по TD. К слову, далеко не всегда нужно для одной модели брать разный TD, но в случае статичного авто, есть днище, где грех не сэкономить, и есть салон, который показывается крупным планом. Поэтому тут чаще всего лучше использовать 3-4 разных TD.

— Стекло фар, лобовое, стекло с приборки, иначе говоря всё, что имеет прозрачность, мы выносим в отдельную группу, чтобы только для этой группы у нас был альфа-канал, в целях экономии общего веса всех текстур. Будем рассчитывать на TD 10-12 px/см.

— Салон, приборка, зеркала, содержимое салона, тут мелкие детали, мелкие фаски, и рендер с близкого расстояния, поэтому TD в диапазоне 10-15 px/см.

— Кузов, колёса и всё что на нём есть, что не попадает в крупный кадр салона, хотим чтобы имело TD не менее 8 px/см.

— Днище, всё что есть под ним будет едва ли видно, будет в темноте, поэтому тут можно сэкономить ресурсы, выделим 3-4 px/см.

Все объекты с одинаковым TD объединяю в один меш, итого 4 меша у меня. Если у тебя один TD на всю модель, то соответственно объединяй всю модель в один меш. Это нужно для того, чтобы аддон посчитал площадь поверхности.

4) Включаю в настройках аддон 3D-Print Toolbox.

5) По очереди выбираю получившиеся меши, узнаю с помощью аддона площадь каждого: 3D-Print > Analyze > Area, записываю.

6) Cчитаем итоговое количество текстурных групп: — стекла тут сильно мало чтобы делать 4к группу на него, поэтому, подставил в расчёт размер текстуры a — 1024px, вышло чётко 10 px

— для салона, при TD 10 px/см, получилось 0,87 текстурные группы, округляем до 1, в итоге TD будет чуть больше, что нам на руку.

— для кузова с колесами получил 1,5 группы, округляю в бОльшую сторону, чтобы получить выше качество, а не ниже, итого 2 группы.

— с днищем тоже пришлось по экспериментировать, 4к оказалось сильно много, а 1к мало, в итоге остановился на одной 2к группе.

Можно сходу пересчитать, какой TD получится у днища, если мы запакуем его в 2к — 5,1 px/см.

Итого на весь джип 5 текстурных групп (1 — 1024, 1 — 2048, 3 — 4096). Я бы сказал, что это скорее много, чем мало, в реальном проекте, скорее всего, были бы более жесткие ограничения. Но это работа для портфеля, тут хочется иметь высокое качество текстур. Главное не ленись делать больше оверлапов!)

В качестве примера модель ученика Кайно — Романова Дмитрия

Texel density. Зачем нужен и как его применять

Эта статья предназначена 3d художникам, техническим художникам, а также всем разработчикам, которые связаны с 3д графикой, текстурами и составлением технических заданий. В ней я покажу чем может быть полезно следование одному текселю, как его считать и на что он может влиять. Основные действующие лица — чеккер, модели, текстуры, мыльцо, UV и прочие радости разработки 3d контента.

0. Что такое texel density.

Для начала, что такое тексель. Texel (аббревиатура от двух слов «TEXture» и «ELement» — текстура и элемент) — элемент текстуры, «точка». Текстура, в свою очередь, представляет собой массив текселей. Тексель может представлять собой цветную точку в изображении. Но, поскольку, текстура может быть не только изображением (двумерным массивом цветных точек), а также и другими массивами данных различных типов и размерности, то тексель, как текстурный элемент — более общее понятие.

Texel density (текселерация, тексель (сокращенно, в контексте)) — это величина, которая является отношением размера текстуры (в пикселях) к габаритам 3d модели в сцене. Texel density характеризует плотность, «качество» текстуры, в общем смысле. Выглядит в техзадании примерно так: 256px/m, 128px/inch, и так далее. Таким образом, текселерация определяет какая площадь текстуры будет отдана на модель исходя из ее размеров. Высокий texel density означает большую детализацию текстуре, низкий — меньшую, размытую текстуру.

1. Применимость texel density.

Наибольшее значение работа с текселерацией имеет при работе с окружением. Это связано с тем, что в окружение чаще используются тайленные текстуры, текстурные атласы и на объекты окружения редко выделяют отдельные карты (на пропсы, разве что). Например, к персонажам, абсолютная текселерация не имеет такого важного значения, т.к. в основном, все персонажи имеют схожие физические размеры. В техзадании на персонажа вполне может быть такое: использовать 2 сета текстур, 2048*2048 для тела, 1024*1024 для головы, и задача художника выжать максимальный тексель, правильно сделав UV развертку. Для элементов окружения, обычно указывают абсолютный тексель (например, 256px/m), т.к. они сильно разнятся по размерам (стена дома, автомобиль, дорога, почтовый ящик).

2. Относительная и абсолютная текселерация

Деление условное, но, думаю, будет полезно сделать на этом акцент. Существует относительная текселерация (в пределах одной модели) и абсолютная — в пределах всей игрых/сцены.

Относительная текселерация должна удовлетворять следующим требованиям:

Единый texel density по всей модели (допускается незначительное увеличение текселя на мелких деталях UV) Из этого правила есть ряд исключений: важные детали должны занимать больше места на развертке (и на текстуре), например лицо персонажа должно иметь больший texel density. Те детали, которые не видны или плохо видны должны иметь меньший тексель (например, днище автомобиля, подошвы ботинок у персонажа).

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


Пример хорошей и плохой текселерации (Источник: quixel.se/tutorial/uv-mapping-for-the-suite)


Пример исключения. Обратите внимание на разницу между четкостью текстур на лице и одежде — и это правильно, т.к. внимание игрока больше направленно на лицо, а не на одежду. (Источник: Fallout 4)

3. Как рассчитывается texel density

Тексель рассчитывается очень просто: необходимо знать размер геометрии и разрешение текстуры, а потом поделить разрешение текстуры на размер геометрии.

Посмотрите на иллюстрацию. Тут изображен куб размерами 1м*1м и плоскости разных размеров. На все объекты применена текстура 1024*1024 пикселей, соответственно, мы имеем следующие texel density для объектов, слева направо: 512px/m, 1024px/m, 2048px/m. Используется только одна текстура, но объекты разные по размерам и, следовательно, мы получаем разный texel density.

Также 3d художники используют различные скрипты и инструменты для подсчета texel density. Помимо показанного выше способа подсчета (т.е. создание специальной эталонной текстуры и подгонки вручную «под квадратики»), существую ряд скриптов для измерения и установки нужного texel density:

3ds Max
Advanced UV Normalizer
Textools

Maya
Nightshade UV
UV Deluxe

4. Как можно привести ассеты к одной плотности?

1. Редактирование UV, использование тайлов


Слева направо: увеличена развертка UV в два раза, без изменений, уменьшена в 2 раза. Таким образом на иллюстрации все объекты имеют один texel density равный 1024px/m.

2. Изменения размера текстур


Для большого объекта использована большая текстура, для меньшего — меньшая.

3. Изменения размеров объекта. Да, таким образом можно повлиять на texel density, но на практике никто ведь не будет делать автомобиль меньше в два раза лишь оттого, что по texel density не хватает плотности текстуры?

5. Как использовать texel density, выводы и полезные советы

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

2. В документации попробуйте определить важность ассетов и соответственно, качество текстур для них. Ассеты первого плана (например, оружие, руки в FPS, персонаж в TPS, вблизи глаз VR приложения), предметы важные для геймплея (например, броня в Fallout 4, верстак, HL2 аптечка на стене и т.д.), предметы окружения и предметы дальнего плана. Тут не помешает сделать тесты прямо в движке с эталонными текстурами, прикинуть как это будет смотреться. Для каждого типа ассета можно использовать собственный texel density.

3. Продолжать следовать этим значениям и при постановке задачи указывать их в ТЗ.
Следование одному texel density для предметов схожих планов и одной значимости даст возможность сделать арт игры более цельным, из него не будут выпадать отдельные элементы в стиле «Вы плохо прорисованы, вас скоро убьют». Также, при использовании этого подхода, будет меньше вероятность потратить ресурсы нерационально (в симуляторе машиниста, на костыли ЖД полотна использовать текстуры 1024*1024, например).

4. Пока я писал черновик Leonardo Iezzi‎ сделал отличный урок по texel density. Обязательно ознакомьтесь со статьей Leonardo, если данная тема интересна.

Плотность текселей и немного теории текстур от Энтони О'Доннелла

Привет и добро пожаловать. Я подготовил данную статью, с целью пролить свет на такую тему как плотность текселей и другие важные элементы теории текстур, которые необходимо понимать всем художникам работающим в области геймдева. Как правило, эти темы не преподаются должным образом, а в сети не так уж и много действительно дельной информации. Я целенаправленно сосредоточился на данной теме , поскольку в начале своей карьеры попросту не понимал всего этого. Исходя из разговоров (за последние 13 лет) со многими художниками, самых разных уровней, я сделал вывод что эта тема не совсем понятна и другим людям. Учитывая это, я решил подготовить данный материал, чтобы попытаться объяснить концепцию плотности текселей и рассмотреть те преимущества, которые она приносит проекту.

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

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

Все геймеры сталкивались со сценариями, в которых разрешение текстур во время игры различается от поверхности к поверхности, и в конечном счёте становится действительно заметным. Большинству игроков наплевать на это — они просто пойдут дальше.

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

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

Для начала я расскажу о теории текстур, которая необходима вам для понимания и применения концепций, лежащих в основе плотности текселей.

Что такое тексель?

Тексель (от англ. Texel, texture element/элемент текстуры) — это наименьший элемент текстурной карты (texture map). Например, если у нас есть текстурная карта с разрешением 1024x1024px — это значит что её размер 1024 текселя в ширину (ось U) и 1024 текселя в высоту (ось V).

Что такое пиксель?

Пиксель (от англ. Pixel, picture element/элемент изображения) — это наименьший элемент цифрового изображения. С точки зрения игрового арта, пиксель — это наименьший элемент цифрового изображения, отображаемого на экране устройства.

Слева: Пример того как текстурная карта, расположенная дальше от камеры, приводит к отображению более одного текселя на один пиксель. Это называется минификацией/преуменьшение (Minification).

Справа: Пример того как текстурная карта может находиться рядом с камерой, в результате чего один тексель накладывается (mapped) более чем на один пиксель. Это называется увеличением (Magnification).

Что такое текстурная карта?

Текстураня карта (texture map) — это цифровое изображение применённое к поверхности (накладываемое на поверхность).

UV-преобразование или UV-маппинг (UV-Mapping) относится к процессу проецирования текстурной карты на поверхность трехмерной модели.

Это делается через UV (текстурные координаты), которые представляют собой координаты положения в двухмерном пространстве. Данные каждой UV координаты присваиваются каждой соответствующей вершине модели.

Это позволяет правильно нанести тексели изображения на модель или поверхность. В приведенном ниже примере показана 3D модель к которой применена текстурная карта. В этом примере тексели, расположенные в точке UV координат A, наносятся (mapped) на вершину модели, также помеченную как A.

Типы компоновки текстур (Texture Layout)

Тайловые текстуры

Текстура с уникальной разверткой

Текстура с уникальной разверткой (Unique Unwrapped Texture). Текстурные карты с такой компоновкой содержат все UV шеллы (shells) ассета, внутри диапазона от 0 до 1 и не повторяются. Обычно один ассет имеет одну текстуру с уникальной разверткой. Листва, показанная на изображении выше, имеет тенденцию использовать текстуры с компоновкой данного типа.

Текстурный атлас

Текстуры с мульти-компоновкой

Типы текстурных карт

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

Albedo/Base Colour

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

В RGB каналах хранятся значения направления, в котором смотрят пиксели. Эти значения обычно получаются посредством переноса этих данных из модели с более высокой точностью (посредством процесса запекания).

Текстура шероховатости определяет, насколько шероховатой или гладкой является поверхность. Данные являются линейными в диапазоне от 0 до 1, где 0 — это 100% гладкость, а 1 — полная шероховатость.

Ambient Occlusion (AO)

Эти текстуры хранят в себе данные об освещении, как если бы модель была освещена мягким окружающим светом. Значения линейны от 0 до 1, где 0 (черный) — это область, в которую свет не попадает.

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

Карта типа Gloss является инвертированной версией карты шероховатости, где 0 — это полностью шероховатая поверхность, а 1 — полностью гладкая поверхность.

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

Opacity Map

Карта непрозрачности/альфа-карта — контролирует уровень прозрачности поверхности: Чёрный — полностью прозрачен, а белый — полностью непрозрачен.

Цель данного раздела объяснить, что нужно знать игровому художнику о цветовых пространствах sRGB и Linear RGB. Основная причина заключается в создании текстур и их влиянии на создание и последующую настройку текстур. Это далеко не самое детальное объяснение, так что дополнительную информацию вы можете найти в сети самостоятельно.

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

Человеческий глаз более чувствителен к тёмным оттенкам, чем к светлым, по этому, ему легче различать более тёмные оттенки. Это привело к созданию гамма-кодирования (gamma encoding) как способа сжатия данных, поскольку оно способствует большей точности в более тёмных областях изображения. sRGB является примером гамма-коррекции (gamma correction). Ниже вы можете увидеть эффект, данного смещения значений, который видно в точке Mid Grey (средний серый).

Сверху: Линейный градиент, в котором каждый шаг приращения(инкремента) имеет одинаковое значение от 0 до 1.

Снизу: Тот же самый градиент после преобразования в цветовое пространство sRGB.

Игровому художнику необходимо знать, что любые текстуры, предназначенные для рендеринга и отображения на экране, такие как Base Color/Albedo/Diffuse необходимо установить в режим sRGB (в используемом 3D пакете или движке).

Ниже приведён пример текстуры Base Color, слева в линейном RGB, а справа в sRGB.

Текстуры, которые предоставляют шейдеру данные для расчёта отклика поверхности (surface response) материала, такие как карты Roughness, Height, Metallic, Ambient Occlusion, Gloss, Opacity или Normal должны находится в линейном цветовом пространстве RGB (Linear RGB colour space).

Что такое MIP-карты?

MIP-карты (Mipmaps) — это предварительно рассчитанные уменьшенные варианты текстурной карты. Они сохраняются на уровнях MIP-карты (mipmap levels) текстурного ассета (texture asset). Каждый её уровень в два раза меньше предыдущего. В приведенном ниже примере каждый уровень окрашен по-разному (для ясности).

Использование MIP-карт не только уменьшает шум от часто повторяющихся деталей (плотная детализация) на расстоянии, но и оптимизирует рендеринг.

Поскольку нижние MIP-уровни рендерятся на расстоянии, это уменьшает количество текселей, сэмплированных на пиксель (sampled per pixel).

На изображении выше, вы можете увидеть, как рендерятся цветные MIP-карты, когда они уходят вдаль. Зеленый (верхний уровень) рядом с камерой и красный (нижний уровень) дальше всего от камеры.

Сделав скриншот в стандартном разрешении 1920×1080 пикселей и увеличив масштаб, вы можете увидеть что версия слева, на которой есть MIP-карты, лучше читается на таком расстоянии, поскольку она сохранила много деталей. Версия без MIP-карт стала более «плоской», потеряв четкость краёв на таком расстоянии.

Сделав скриншот с более высоким разрешением (7680 X 4160 пикселей) и увеличив масштаб, вы увидите это более явно.

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

Упаковка текстурных карт в каналы

Упаковка каналов означает добавление отдельных GreyScale карт в каждый канал текстуры. Это уменьшает количество текстур, сэмплируемых шейдером, и является действительно хорошей оптимизацией для уменьшения объема памяти, которую занимают текстуры в сцене. Поскольку эти текстуры (как правило) являются данными для шейдера, их необходимо использовать в линейном цветовом пространстве RGB.

Теперь пора перейти к основной теме данной статьи — плотность текселей (Texel Density).

Что означает «плотность текселей»?

Плотность текселей означает число текселей, накладываемых на поверхность.

В примере слева мы видим текстуру 1024×1024, нанесенную на плоскость площадью 1m². Плотность текселей здесь равна 10.24 текселей на СМ. 1024 (текселей) ÷ 100 (СМ) = 10.24 (текселей).

В примере справа мы видим текстуру 256×256, нанесенную на плоскость площадью 1m². Плотсность текселей здесь равна 2,56 текселя на СМ. 256 (текселей) ÷ 100 (СМ) = 2,56 (текселя).

Работа c тайловыми текстурами

Чтобы выяснить, сколько раз наложить/повторить текстуру на поверхность для достижения целевой плотности текселей (target texel density), вам необходимо знать следующее:

  • Выбранная вами плотность текселей на M или CM
  • Размеры площади поверхности в M или CM
  • Размер текстуры которая будет использоваться в текселях, например. 512×512, 1024×1024 и т.д.

Получив эту информацию, вы можете использовать приведенное ниже уравнение.

Целевая Плотсность Текселей x Длина стороны поверхности ÷ Размер текстуры = число повторений (тайлинга)

Здесь приведены два примера на основе данного уравнения: один в CM и один в M, оба работают с плотностью 10.24 текселей на 1CM.

Сохранение постоянной плотности текселей с тайловыми текстурами

Данный пример показывает, как тайлятся (повторяются) текстуры разного размера для поддержания постоянной плотности 20.48 текселей на 1CM.

На поверхности площадью 2m², текстура с разрешением 2048 повторяется дважды, тогда как текстура 1024 должна повториться уже четыре раза, а текстура 512px — восемь раз. Это повторение может быть выполнено посредством масштабирования UV-шеллов или посредством умножения значений UV, непосредственно в шейдере.

Чтобы определить подходящий размер текстуры для модели с уникальной разверткой, так чтобы она соответствовала определенной плотности текселей, используйте метод приведенный ниже:

  • Определите общую площадь поверхности (total surface area или сокращенно TSA) формы (для оценки сложных моделей используйте прокси болванку).
  • Получите квадратный корень из общей площади поверхности и убедитесь, что он равен m² или cm².

Получив эту информацию, вы можете использовать приведенное ниже уравнение.

Целевая Плотность Текселей x Площадь Поверхности² = Размер текстурной карты

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

Чтобы вычислить общую площадь поверхности, уравнение выглядит следующим образом:

TSA : 2(WxH) + 2(WxL) + 2(LxH)

В данном примере TSA прокси объекта вычисляется так:

TSA = 2(80×50) + 2(80×20) + 2(20×50) = 13200

Квадратный корень из 13200 равен 114,891

10,24 на CM x 114,89 = 1176,47‬

Округление в меньшую сторону показывает что для данного ассета подойдет текстура с разрешением 1024×1024.

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

5,12 на CM x 114,89 = 588,24

Если предыдущий способ показался вам излишне сложным (как и мне), есть ещё один метод.

  • Разверните модель на UV-шеллы с постоянной плотностью текселей (на картинке в центре).
  • Упакуйте UV-шеллы в пространство UV 0-1
  • Используя удобные вам инструменты для работы с UV, определите плотность текселей на единицу относительно размера текстуры.
  • Это даст вам достаточно информации для принятия решения.

Затем, используя свои инструменты для работы с UV (я использовал Maya), вы можете выбрать UV-шеллы и «получить» («Get») значение текселей на единицу, относительно размера карты, как показано ниже.

Целевая плотность текселей составила 10.24 на 1CM. Ничего не попало в это значение, но 1024 даёт плотность текселей на CM равную 7.5686, что является наиболее близким к целевому значению.

Можно было бы использовать текстуру 2048, которая дала бы TD равную 15.1372 на 1CM. Это может быть подходящим для пропса который имеет важное значение (hero prop).

Ещё более простой, но менее точный метод — развернуть плоскость размером 1m² в UV пространстве 0 до 1 и затекстурить её с помощью контрольной, текстуры в виде шахматного узора (checker pattern) размером 1024×1024. Поскольку единицы измерения сцены в программе задаются в сантиметрах, то данная плоскость будет корректно покрыта текстурой 1K, и мы получим 10,24 текселя на 1CM.

Затем, отмасштабируйте UV-шеллы модели до тех пор, пока шашечки узора не будут соответствовать размеру квадратов на нашей референсной плоскости.

  • Единицы сцены указаны в CM
  • Размер карты установлен на 1024.
  • Плотность текселей составляет 10,24 на 1CM.

Однородность плотности текселей

Выбранная плотность текселей составляет 10.24 текселя на CM. Это действует как текстура 2048×2048 на поверхности 2m².

Типы материалов которые используются в данном примере:

Как мы говорили выше UV-шеллы можно масштабировать, «сравнивая» их с корректно развернутым эталонным мешем или используя опции текущих инструментов, которые можно найти в большинстве DCC пакетов или используя сторонние плагины. В данном примере (на изображении ниже), выбранный UV шелл отмасштабирован таким образом чтобы площадь его поверхности соответствовала 10.24 текселям на CM.

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

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

Дополнительный совет. Один из полезных трюков с UV-развёрткой — группируйте шеллы на основе материала или набора текстур, как показано выше. Это сделает дальнейшее редактирование более удобным.

Используя данную модель в качестве примера (на изображении ниже) и рассмотренные ранее методы определения плотности текселей, я покажу, как это работает. Целевая плотность будет 5.12 текселей на CM.

В случае с фасадом здания наша цель состоит в том, чтобы вычислить, сколько раз накладывать текстуру 1024×1024, чтобы достичь заданной плотности текселей для «кирпичной» поверхности.

Целевая Плотсность Текселей x Длина стороны поверхности ÷ Размер текстуры = число повторений (тайлинга)

5.12 x 360 CM ÷ 1024 = 1.8 Значение для оси U (Горизонталь)

5.12 x 310 CM ÷ 1024 = 1.55 Значение для оси V (Вертикаль)

Для двери будет использовано следующее уравнение:

Целевая Плотность Текселей x Площадь Поверхности² = Размер Текстурной карты

Примечание: Тут у автора, скорей всего опечатка в обозначении. Вместо Площади Поверхности в квадрате, нужен квадратный корень Площади Поверхности.
То есть Целевая Плотность Текселей x √ Площадь Поверхности = Размер Текстурной карты
Умножаем 190*120. Получаем 22800. Извлекаем квадртаный корень из 22800 и получаем 150,996. Ну, тут автор видимо решил округлить до красивых 150. Хотя округлить стоило бы до 151.

Учитывая рассчитанное покрытие текстуры в 768 текселей, нам подойдет текстура 1024 X 1024, оставив место и для других элементов, таких как дверной косяк.

Масштаб деталей

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

В приведённом выше примере мы придерживаемся заданной плотности текселей, при которой 2K текстура накладывается на поверхность площадью 2м². Поверхность выглядит четкой и детализированной, так что это УСПЕХ. Верно?

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

Обычно это «исправляется» посредством тайлинга текстуры по поверхности, как это сделано в данном примере. Теперь, несмотря на то, что 2K текстурная карта повторяется 4 раза на поверхности площадью 2м². Это делает плотность текселей равной 20.48 на 1 CM по сравнению с целевыми 10.24 на 1 CM. Чем чаще текстура будет «повторяться», тем больше будет увеличиваться это значение.

Это текстура с заданной плотностью текселей 10.24 на CM. Здесь мы видим её верхнюю MIP-карту.

Когда текстура тайлится по поверхности четыре раза, то отрисовываются более низкие уровни MIP-карты. Это делает использование опции «более высокого разрешения» для тайловых 2K текстур немного избыточным, поскольку на те самые желанные мелкие детали будет неблагоприятно влиять MIP-маппинг, который необходим.

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

Это пример 2K текстуры на поверхности 2M² с корректной плотностью 10.24 текселей на CM. Преимущество этого заключается в том, что каждый квадрат уникален, что даёт нам больше вариаций на поверхности, и это приводит к лучшему тайлингу на больших поверхностях.

На таком расстоянии использование 2K текстуры, которая повторяется четыре раза на площади 2m², не будет иметь заметной визуальной разницы с точки зрения качества, но будет иметь заметные повторяющиеся элементы.

Карты детализации (Detail maps) используемые в шейдере, могут иметь большое значение, в тех случаях, когда материалы рассматриваются вблизи. При этом, нам не надо нарушать правила плотности текселей или ставить под угрозу разнообразие текстур.

Всегда настраивайте размер элементов в текстурной карте в соответствии с требуемым масштабом. Так чтобы они соответствовали площади поверхности, к которой они будут применяться. Во всех вышеперечисленных случаях текстуры 2048×2048 применяются к плоскости 2m².

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

Приведение к заданной плотности текселей

Давайте рассмотрим два способа приведения к заданной плотности текселей. В обоих случаях будет назначена текстура 2048×2048. Листва будет использовать всё текстурное пространство с UV-разверткой, которая имеет постоянную плотность текселей. В случае с портфелем, мы позволим заданной плотности текселей определить, сколько места он получит.

Здесь мы видим UV развёртки наших моделей. Листва полностью заполняет собой пространство с конечным разрешением текстуры, которое будет определено позже. У чемодана UV-шеллы отмасштабированы до соответствующего размера с целью достижения желаемой плотности текселей — 10.24 на 1CM на текстуре 2048. Это приводит к тому, что остаётся много места для других ассетов, которые могут разделить между собой оставшееся текстурное пространство, например, альтернативные варианты чемодана или какие-то другие пропсы из этой сцены.

После применения текстуры-чеккера в 2K разрешении, становится отчетливо видно что плотность текселей у листвы слишком плотная. В данный момент она составляет 28.09 текселей на CM. Способ решения данной проблемы — уменьшить размер текстурной карты (мы сделаем это чуть позже). В свою очередь портфель, уже выглядит однородно, поскольку шеллы были отмасштабированы должным образом/корректно. Данный метод также работает при создании развёртки для моделей которые будут использовать тайловые текстуры.

Понижение разрешения текстуры листвы до 1024×1024 делает её более близкой к желаемым 10.24 на CM — плотность текселей составляет 14.04 текселей на CM. В действительности, я бы оставил её как есть, поскольку в играх листва часто масштабируется, и в данном случаев, её выгодно иметь в более высоком разрешении.

Уменьшение разрешения текстуры листвы до 512 X 512 приводит к слишком низкому значению плотности — 7,02 текселей на CM. Листва — один из тех случаев, когда немного повышенное значение TD, относительно заданной плотности текселей — это неплохо, поскольку в большинстве игр разных жанров, она часто оказывается близко к камере и игроку.

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

Как выбрать плотность текселей которая будет использоваться в проекте по умолчанию? Существуют самые различные способы сделать это. Некоторые возможно будут даже лучше чем мой. Данный способ оценки проекта используемый для определения подходящей плотности текселей сослужил мне хорошую службу. Общая концепция состоит в том, чтобы сделать блокаут условной сцены (всего несколько мешей) вместе с настроенной камерой.

Окончательное решение определяется следующими критериями:

  • Разрешение текстур при приближении к камере
  • Баланс между разрешением и покрываемой площадью поверхности
  • Балансировка ограничений по памяти

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

  • Текстура с разрешением 512×512 использует примерно 171 KB
  • Текстура с разрешением 1024×1024 использует примерно 683 KB
  • Текстура с разрешением 2048×2048 использует примерно 2731 KB

Чтобы наглядно продемонстрировать то, как работают уровни MIP-карт в этих примерах, я раскрасил их в разные цвета (исключительно в отладочных целях).

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

Тестовые сцены на основе стандартных игровых шаблонов Unreal Engine 4.

FPS Default Camera Example

На изображении выше, все поверхности развернуты одинаково с плотностью текселей 10.24 на 1CM. Текстура 1024×1024. будет покрывать поверхность площадью 1m², а 2048×2048 поверхность площадью 2m². Обратите внимание, что MIP самого верхнего уровня 2048×2048 «белый/серый» при использовании данного вида (положение камеры) не виден вообще, а второй MIP уровень (оранжевый) 1024×1024 текселей виден только в самой нижней части экрана.

В этом примере плотность текселей равна 5.12 на 1CM. Текстура 512×512 покроет 1m², а 1024×1024 покроет поверхность площадью 2m². Верхний MIP уровень в данном примере — оранжевый, который теперь виден в нижней части экрана. При использовании такого вида разница между плотностью текселей 10.24 и 5.12 текселей на CM, нанесенных на одну ту же поверхность, вообще не заметна.

В этом примере плотность текселей равна 2.56 на 1CM. Текстура размером 256х256 покроет поверхность площадью 1m². Текстура 2028×2048 покроет поверхность площадью 8m². Верхний MIP-уровень (зеленый) теперь заполняет большую часть экрана, что эффективно с точки зрения рендеринга, но это вызовет проблемы с качеством при смене вида (положения камеры).

FPS Example: Сравнение разрешения

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

Вы можете явно увидеть, как повышенная плотность текселей (пример слева) значительно отличается от низкой плотности текселей (пример справа) с точки зрения качества изображения. Стоит отметить, что изображение по середине — это хороший пример компромисса между качеством/площадью покрытия/разнообразием.

Слева на право:
1024×1024 текселей на 1OOcm (10.24 текселей на CM)
512×512 текселей на 1OOcm (5.12 текселей на CM)
256×256 текселей на 1OOcm (2.56 текселей на CM).

На скриншотах сделанных ранее с использованием стандартного FPS вида, было отмечено, что верхний MIP-уровень, при плотности 10.24 текселей на CM, не был заметен вообще. Теперь же, когда камера наклонена к земле стали видны верхние MIP’ы. С точки зрения качества трудно сказать есть ли разница, когда плотность составляет от 10,24 до 5,12 текселей на CM. Однако, с более низким разрешением 2.56 текселей на 1CM, вы можете заметить что результат становится более размытым.

Слева на право:
1024×1024 текселей на 1OOcm (10.24 текселей на CM)
512×512 текселей на 1OOcm (5.12 текселей на CM)
256×256 текселей на 1OOcm (2.56 текселей на CM).

Как мы видим на приведенном выше примере, на крупных планах, камера может снимать под углом вдоль различных поверхностей, таких как стены. В этом случае проявляется верхний MIP-уровень текстуры 2048×2048, которая наложена на поверхность с плотностью 10.24 текселей на 1CM, и занимает значительную часть экрана. Это то самое место, где вы хотели бы иметь приличную плотность текселей.

Здесь тот самый случай когда мы видим разницу в разрешении между плотностью в 10.24 текселей на 1CM и 5,12 текселей на 1CM. При такой плотности текселей верхний MIP-уровень распространяется на гораздо большую площадь поверхности.

При такой плотности текселей качество падает, а текстура на поверхности стены, которая находится ближе всего к камере, выглядит размытой и имеет низкое разрешение. Несмотря на то, что такая плотность эффективна с точки зрения рендеринга пикселей, она не отличается высоким качеством. Также стоит отметить, что во всех этих примерах здания на заднем фоне всегда использует более низкие MIP-уровни: 64X64 и 32X32 из-за их удаленности от камеры.

Разница в разрешении при разных значениях TD

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

После рассмотрения различных случаев, 10.24 текселей на 1CM — это лучший выбор в плане качества для игры в стиле FPS.

5.12 текселей на 1CM — это разумный компромисс между качеством и визуальной точностью. Если бы он поднялся до 20,48 на 1CM, возникла бы проблема с тем, что в большинстве случаев верхний MIP-уровень был бы виден только по краям экрана.

С учетом сказанного, когда дело доходит до рендеринга изображений в 4K и 8K с помощью более мощных графических процессоров, в будущем это вполне может потребоваться.

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

Top Down Camera Example

Теперь перейдем к примеру где используется камера типа «сверху-вниз». Данный изометрический вид означает, что диапазон MIP-уровней от земли до камеры значительно сократится, по сравнению с камерой от первого лица или от третьего лица. Как мы видим, в приведенном ниже примере, для большей части сцены рендерятся средние MIP-уровни. Верхние MIP-уровни (белый/оранжевый) и нижние (фиолетовый/синий) не используются.

Приблизив камеру к поверхности здания, можно увидеть, как рендерятся различные уровни MIP-карт. При использовании TD 10.24 текселей на 1CM, верхний MIP-уровень не виден. Он проявляется только если камера находится прямо напротив поверхности.

На нижеследующем изображении почти все MIP-уровни рендерятся по всей сцене. Количество тайлов на фасаде здания кажется разумным. С другой стороны, поверхность земли повторяется слишком часто. Это расточительно, поскольку рендерятся только MIP-уровни 256X256 и 128X128, а более высокие MIP-уровни не используются.

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

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

В данном примере, плотность текселей на зданиях составляет 5.12 текселей на 1CM, а текстура 1024×1024 наложена на поверхность площадью 2m². Плотность текселей для земли составляет 2.56 текселей на 1CM, как в предыдущем примере. Текстура 2048×2048, наложена на поверхность площадью 8m².

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

Third Person Camera Example

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

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

Это стандартный вид камеры от третьего лица. Отображаемая плотность текселей составляет 10.24 текселей на 1CM. Вы можете видеть как распределяются уровни MIP-карты по всей сцене.

Снизим плотность до 5.12 текселей на 1CM, в таком случае верхний MIP-уровень будет охватывать большую часть сцены. По качеству заметного падения нет.

На изображении ниже показано падение до 2,56 текселей на 1CM. Стена слева имеет заметно более низкое разрешение.

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

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

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

  • FPS — Example: 10.24 текселей на CM
  • Third Person — Example: 5.12 текселей на CM (С использованием Detail Map, чтобы скомпенсировать приближение к поверхностям).
  • Top Down — Example: Смешанная плотность текселей. (Ассеты близкие к камере — 5.12 текселей на CM, поверхность земли — 2.56 текселей на CM).

Удаленные/крупные объекты

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

Поверхности рядом с камерой

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

Масштабируемые поверхности

Другой причиной могут быть поверхности/объекты, которые можно использовать в разных масштабах, например камни. В игровой сцене их размер может варьироваться в диапазоне 100-200% от исходного размера. С этим может справиться шейдер с картами детализации (detail maps), или ассет может иметь более высокую плотность текселей, чтобы обеспечить определенный диапазон масштабирования.

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

Поверхности на возвышенностях

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

Модели персонажей

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

Внешний вид

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

Оптимизация рендеринга

Как объяснялось ранее, MIP-карты — это оптимизация, которая уменьшает количество текселей, выбираемых (sampled) пикселем на расстоянии, что снижает стоимость рендеринга. Эта проблема также может возникнуть, если художник накладывает более высокую плотность текселей на поверхность, например 500 текселей на 1cm, это заставит GPU сэмплировать гораздо большее количество текселей на пиксель. Стоимость не будет астрономической, но стоимость будет накапливаться, если это станет типичной ситуацией в процессе визуализации вашей сцены

Оптимизация потребления памяти

Ещё одно преимущество соблюдения определенной плотности текселей в проекте заключается в том, что это гарантирует использование текстур подходящего и целесообразного размера (относительно размера меша). Это позволяет художникам уверенно назначать ресурсы там, где это необходимо. Например, если статуе с уникальной разверткой нужен набор текстур 2048, который обеспечивает 10.24 текселей на CM, или если небольшой бочке может потребоваться набор текстур с разрешением всего лишь 512 для поддержания постоянной плотности. Художник сможет самостоятельно принять обоснованное решение, вместо того, чтобы бездумно генерировать набор текстур 2048 для каждого ассета.

Единообразие в пределах команды

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

C 9 лет я стремился стать художником и рисовал свои собственные комиксы, подражая визуальным эффектам, увиденным мною в комиксах, фильмах и мультфильмах 90х. Я вырос, обожая ремесло создания арта во всех его формах, которые всё ещё применяются сегодня — так же, как и тогда.

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

Я успел поработать над 6 выпущенными проектами, включая DLC, а также над проектами, которые не дошли до релиза — игры в разных жанрах, для разных платформ и с разным художественным стилем. Я накопил довольно много знаний касательно производства арта для игр. Мне очень повезло поработать с множеством талантливых художников и разработчиков игр, которые внесли определенный вклад в моё развитие (огромное спасибо каждому из вас).

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

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

Посмотрите на их прекрасные работы!

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

Идите вперёд и создавайте игровой арт, который все оценят 🙂

Текст перевёл и подготовил: Константин Пономарёв

Офигенно полезная статья, спасибо!♥️

Базовая база по теории uv разверток.
Другое дело что в реальности все делается. скорее. на глазок.

Вот это старый добрый DTF. Ресурс, на котором можно было найти офигенные статьи о разработке, а не бложики в стиле "Я пакакал посоны! Ахаха".

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

Геймдев и Инди не репостим в Якорь. Для подсайта Лонгриды подходит. Автора я знаю и слежу за ним, так что под его работами меня можно не призывать. Сначала почитаю потом разберусь

от тебя вообще ничего не скрыть!

Впервые вижу такое понятие, как плотность текселей или тексель на см. Тексель = пиксель/см (ну или на м).

это релевантно для unity?

Конечно, это база.

Понял вас , господин Мега Драйв

самая бесячая часть в 3D моделировании… текстурирование >_<

Вот это объем, тут несколько дней уйдет на то, чтобы это все осмыслить)

Слишком круто для вечернего чтения, это полноценная лекция.�� Спасибо.��

А тут сколько текселей?

Правильный ответ — 4 головы.

Cтатья, несомненно, очень полезная и в целом хорошая, но чрезмерно усложняющая и иногда запутывающая в изложении.
"Слева: Пример того как текстурная карта, расположенная дальше от камеры, приводит к отображению более одного текселя на один пиксель. Это называется минификацией/преуменьшение (Minification)."

— по моему, так как как сформулированно — такого быть не может :> Именно — отображения. Наложение последовательное разных пикселей текстуры(текселей) на один и тот же пиксель — да. :>
Дело не в том, что я буквоед, но такое изложение затрудняет понимание.

Тексель — пиксель(точка) текстуры (это тоже надо было так и сказать). Пусть будет меньше слов вроде "наименьший элемент( т.е. точка) текстурной карты (т.е. текстуры), а больше точного и ёмкого смысла :>

"Наши глаза воспринимают свет не линейно, а по кривой. " — вообще не верная фраза :>
Просто по смыслу даже.
Восприятие цветов(!) ( т.е. длины волны) нашими глазами — укладывается в кривую. А не ""Наши глаза воспринимают свет не линейно, а по кривой. " :))) Глаза наши воспринимают СВЕТ вполне себе линейно :>
Не знаю, перевод это такой или оригинал.

" это уменьшает количество текселей, сэмплированных на пиксель (sampled per pixel)." — "сэмплированных" — а это вообще — зачем ? :> Накладываемых. :>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

From $34/Day — Car Rental HPN With Zero Terminal Shuttle