LerpworksAcademy

Справочник

Глоссарий

Графика

255 терминов
АвтоэкспозицияAuto exposure, eye adaptationЭкспозиция, которую движок подбирает сам по яркости кадра, как глаз: строит гистограмму, отбрасывает самые тёмные и яркие пиксели и плавно подводит множитель. Пока ставишь свет, её лучше зафиксировать.
Алгоритм художникаPainter's algorithmРисовать от дальнего к ближнему, чтобы ближнее ложилось поверх. Не справляется с пересечениями и тратит работу на закрытое. В 3D его заменил буфер глубины, а прозрачное и 2D так рисуют до сих пор.
АлиасингAliasingОшибка от недостатка проб: пиксель измеряет мир в одной точке, и деталь мельче шага между пробами пропадает или выдаёт себя за крупную. Отсюда лесенки, муар, искры и мерцание в движении.

Бывает геометрическим (края), шейдерным (искры блика, порог листвы) и временным (мерцание при движении). Пиксель — одна проба.

АльфаAlpha, opacityЧетвёртое число пикселя рядом с R, G и B: какую долю слой закрывает. 1 — закрывает всё, 0 — ничего. Это непрозрачность, а не прозрачность.

В Unreal вход материала называется Opacity, для Masked — Opacity Mask. Альфу берут из канала текстуры, из числа, из цвета вершин или частицы. Что с ней сделать — заменить пиксель, выбросить его или смешать, — решает режим смешивания.

Альфа-тест, режим MaskedAlpha test, alpha clip, cutoutШейдер сравнивает альфу с порогом: выше — пиксель рисуется как непрозрачный, ниже — выбрасывается целиком. Пишет глубину и не требует сортировки, но край выходит ступеньками.

Порог по умолчанию: в Unreal 0.3333 (Opacity Mask Clip Value), в Unity и Godot 0.5. Выбрасывание пикселя мешает ранней проверке глубины, поэтому Masked дороже Opaque.

Анизотропная фильтрацияAnisotropic filtering, AFНесколько проб вдоль вытянутого следа пикселя на текстуре, когда поверхность видна под острым углом. Убирает мыло на полу и дорогах у горизонта; ×2…×16 — предел числа проб.

Число проб — отношение длинной стороны следа к короткой, но не больше предела; уровень мип-мапа берут по длине одной пробы. Пол под острым углом.

АпскейлUpscaling, super resolutionКадр рисуют меньше экрана, а полный собирают из истории по джиттеру и векторам движения. «Производительность» — половина стороны, четверть пикселей. DLSS, FSR, XeSS и TSR различаются тем, как решают, чему в истории верить.
Атрибуты материалаMaterial AttributesВсе каналы материала одним набором. Так функции материала передают друг другу сразу всё: цвет, шероховатость, нормаль.
Белый шумWhite noiseСвоё независимое случайное число в каждом пикселе. Соседи не связаны, поэтому выходит зерно, как песок или экран без сигнала, а не пятна.
Бесшовная текстураSeamless / tileable textureТекстура, у которой левый край продолжает правый, а верхний — нижний. Только такую можно повторять без видимых стыков.
Билинейная фильтрацияBilinear filteringСмешивание четырёх ближайших текселей по тому, насколько адрес близок к каждому: два lerp по горизонтали и один по вертикали. Убирает квадраты, но подробностей не добавляет.
Бинормаль, BBitangent (binormal)Стрелка на поверхности вдоль роста V. Её не хранят, а получают из нормали и касательной со знаком: B = знак × (N × T). Знак нужен для зеркальных развёрток.
Ближайший тексельNearest / point filteringФильтр, который берёт один тексель — тот, куда попал адрес UV. Вблизи текстура распадается на чёткие квадраты: для пиксель-арта это и нужно, для остального — нет.
Ближняя и дальняя плоскости отсеченияNear and far clip planesГраницы видимого по расстоянию: что ближе ближней плоскости или дальше дальней, не рисуется. Ближняя плоскость задаёт точность всего буфера глубины.
Буфер глубиныDepth buffer, Z-bufferВторая картинка размером с кадр: в каждом пикселе хранится, насколько далеко от камеры то, что в нём нарисовано. По ней видеокарта решает, что ближе.
Буфер трафаретаStencil bufferЕщё одно небольшое число на пиксель рядом с глубиной, обычно 8 бит. Работает как маска: её пишут и проверяют, чтобы рисовать только в отмеченных пикселях — обводки, порталы, декали.
Бюджет кадраFrame budgetСколько миллисекунд есть на один кадр: 1000 / FPS. 16.7 мс при 60 кадрах в секунду, 33.3 при 30, 8.3 при 120. Логика, физика и все проходы отрисовки делят это время.

Мерить удобнее в миллисекундах: они складываются, а кадры в секунду — нет. Миллисекунды, а не кадры.

Варп, волнаWarp / wavefrontГруппа из 32 или 64 вызовов шейдера, которые видеокарта выполняет одной командой. Если на ветвлении они расходятся, группа проходит обе ветки.
Вектор отраженияReflection vectorКуда смотрит отражение из точки поверхности: взгляд, у которого часть вдоль нормали развёрнута, а часть вдоль поверхности осталась. r = d − 2 (d · n) n.

d — направление от глаза к точке, n — единичная нормаль. Двойка: один раз часть вдоль нормали убирают, второй — разворачивают. Отсюда «угол падения равен углу отражения». Куда смотрит отражение.

Векторы движенияMotion vectors, velocity bufferКартинка, где в каждом пикселе записано, на сколько пикселей и куда сдвинулась его точка за кадр. По ним временное сглаживание и апскейлеры находят точку в истории. Нет стрелок — шлейф.

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

Вертикальная синхронизацияVertical sync, V-SyncКадр показывают только в момент обновления экрана. Нет разрывов картинки, но кадр, опоздавший хоть на миллисекунду, ждёт следующего обновления: на экране 60 Гц 60 кадров проваливаются сразу в 30. Перед замером её выключают.
ВершинаVertexТочка модели. Хранит позицию, нормаль и UV, иногда ещё цвет вершины и вторую развёртку.
Вершинный шейдерVertex shaderВыполняется для каждой вершины: переводит её в координаты экрана и может сдвинуть, например чтобы трава качалась.
Видеокарта, GPUGraphics processing unitПроцессор из тысяч простых вычислителей, которые выполняют одну и ту же программу над разными данными. Поэтому пиксели кадра он считает параллельно.
ВидеопамятьVideo memory, VRAMПамять самой видеокарты: текстуры, меши, карты теней, G-буфер, кэши света. У игровых видеокарт обычно 8–16 ГБ. Пока всё влезает, она почти ничего не стоит; переполнилась — мыльные текстуры, рывки, падение.
ВиньеткаVignetteЗатемнение краёв кадра, как у объектива. Вместе с зерном, хроматической аберрацией и бликами линзы — недостатки камеры, которые добавляют нарочно; в меру ведут взгляд, лишние мылят кадр.
Виртуальная текстура RVTRuntime Virtual TextureТекстура, в которую ландшафт пишет свой цвет и высоту, чтобы другие материалы могли их прочитать, например чтобы камень врастал в землю.
Виртуальные карты тенейVirtual shadow maps, VSMОгромная карта теней 16 384 × 16 384, разбитая на страницы 128 × 128: движок рисует только страницы, нужные видимым пикселям, и хранит их между кадрами. Тексель примерно равен пикселю экрана.

Метод теней Unreal Engine 5 по умолчанию, рассчитан на Nanite. Всё, что шевелится, каждый кадр портит свои страницы. EEVEE в Blender с 4.2 тоже использует виртуальные карты. Виртуальные карты теней.

Воздушная массаAir massСколько воздуха на пути луча по сравнению с путём из зенита: 1 над головой, около 38 у горизонта. Чем она больше, тем сильнее свет ослаблен и тем краснее солнце.
Временное сглаживаниеTemporal anti-aliasing, TAAКаждый кадр камеру сдвигают на долю пикселя и подмешивают новый кадр к накопленной истории небольшой долей. По векторам движения история берётся там, где точка была раньше. Цена — шлейфы и мыло в движении.

Историю сверяют с соседями пикселя в новом кадре и отбрасывают, если такого цвета рядом нет. Временное сглаживание.

Вызов отрисовкиDraw callКоманда процессора видеокарте: вот шейдер, вот параметры и текстуры, нарисуй эти треугольники. Между вызовами меняется состояние, и смена шейдера обычно дороже смены параметров.
Высотный туманHeight fog, Exponential Height FogТуман, плотность которого убывает с высотой по экспоненте: в низинах молоко, вершины и небо над головой чище. Сумма плотности вдоль луча считается одной формулой, поэтому он дешёвый.
ГаммаGammaСтепень, по которой запись цвета переводят в свет: свет ≈ запись в степени 2.2. Поэтому 0.5 в записи — около 22 % света, а половина света записывается как 0.74.

Точная кривая sRGB — прямой отрезок у нуля и степень 2.4 со сдвигом; в целом она ведёт себя как степень 2.2. Гамма: запись по кривой.

Глобальное освещение, GIGlobal illuminationВсё освещение сцены вместе — прямое и непрямое. На практике так называют способ, которым движок считает непрямой свет: подсветку, небо, запечённый свет, пробы или расчёт в реальном времени.

Способы по цене: постоянная подсветка, свет неба, лайтмапы, пробы, GI в реальном времени — Lumen в Unreal, SDFGI и VoxelGI в Godot. Глобальное освещение: способы по цене.

Глобальный параметр шейдераGlobal shader parameterЗначение, общее для всех материалов сразу: время, ветер, мокрость после дождя, снег. Меняешь в одном месте — меняется весь мир.

В Unreal — Material Parameter Collection, в Unity — Shader.SetGlobal…, в Godot — global uniform. Урок

Глубина резкостиDepth of field, DOFРазмытие всего, что ближе или дальше фокуса, как у фотоаппарата. Считается по текстуре глубины: чем дальше пиксель от фокуса и шире диафрагма, тем сильнее размытие.
Глубина цветаBit depthСколько бит отводится на канал. 8 бит дают 256 ступеней, поэтому в палитрах редакторов цвет записывают числами от 0 до 255.
Дальность отсеченияCull distanceРасстояние, дальше которого предмет не рисуют, потому что он меньше пикселя. Для мелочи — меньше, для крупного — больше; край растворяют дизерингом.
Данные объектаPer-object / per-instance dataЧисла, которые каждый предмет несёт сам при общем материале: оттенок куста, вспышка попадания. Материал один, поэтому предметы можно рисовать инстансингом.

В Unreal — Custom Primitive Data и Per Instance Custom Data, в Unity — MaterialPropertyBlock, в Godot — instance uniform. Урок

Данные, не цветNon-color dataТекстура, где числа идут в формулу как есть: нормали, шероховатость, металличность, AO, высота, маски. Её читают без кривой sRGB, иначе середина шкалы съезжает: 0.5 становится 0.21.
ДекальDecalРисунок, спроецированный на готовую поверхность: трещина, лужа, граффити. Своей геометрии у проецируемой декали нет: по глубине она находит поверхность и меняет её цвет, нормаль и шероховатость до расчёта света.

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

ДжиттерJitter, sub-pixel jitterСдвиг камеры каждый кадр на долю пикселя по кругу из 8–16 положений. Благодаря ему пробы разных кадров ложатся в разные точки пикселя, и временное сглаживание набирает из них много проб.
ДизерингDithering, screen-door transparencyПолутон заменяют узором из целых и выброшенных пикселей. Пиксели пишут глубину и не требуют сортировки, а временное сглаживание усредняет узор в полупрозрачность.
Динамический инстанс материалаMaterial Instance Dynamic, MIDИнстанс материала, созданный во время игры, чтобы менять его параметры: вспышка, растворение, свечение. Статические параметры он менять не умеет, и каждый MID — отдельный материал для отрисовки.
Динамическое разрешениеDynamic resolutionДвижок сам снижает разрешение кадра, когда видеокарта не успевает в бюджет, и поднимает, когда есть запас. Апскейл прячет разницу.
Диффузное отражениеDiffuse reflectionСвет, который зашёл внутрь вещества, рассеялся на пигменте и вышел во все стороны. Он окрашен цветом вещества и не зависит от того, откуда смотришь.
Диэлектрик, неметаллDielectricЛюбое вещество, кроме металла: камень, дерево, пластик, кожа, вода, краска, ржавчина. Цвет ему даёт диффуз, а отражение слабое и бесцветное.
Домен материалаMaterial DomainНастройка мастер-материала в Unreal: что он рисует — поверхность меша, декаль, маску света, объём, пост-обработку, интерфейс или виртуальную текстуру. От неё зависят выходы главной ноды и то, что материал может читать.
Задержка вводаInput latency, input lagВремя от нажатия кнопки до картинки на экране. Процессор и видеокарта работают над разными кадрами, а при упоре в видеокарту кадры ещё и копятся в очереди, поэтому задержка — несколько кадров.

Режимы низкой задержки (NVIDIA Reflex, AMD Anti-Lag) запускают расчёт кадра впритык к видеокарте. Генерация кадров задержку не уменьшает. Кадр в пути.

Закон ЛамбертаLambert's cosine lawОсвещённость поверхности пропорциональна косинусу угла между нормалью и направлением на свет. Отсюда яркость = max(0, dot(n, L)).
Закон обратных квадратовInverse square law, inverse squared falloffСвет точечного источника падает как 1 / расстояние²: вдвое дальше — вчетверо темнее. Та же порция света ложится на вчетверо большую площадь.

Движки обрезают его радиусом затухания (Attenuation Radius в Unreal, Range в Godot), у края свет плавно гасят. Солнце так далеко, что для сцены не затухает. Вдвое дальше — вчетверо темнее.

Запекание светаLight baking, precomputed lightingРасчёт освещения заранее, в редакторе: тысячи лучей и несколько отскоков, результат — в лайтмапы и пробы. В игре от расчёта остаётся выборка из текстуры, но ничего не может двигаться.

Выигрыш — мягкие тени и отскоки почти бесплатно. Цена — время запекания, память, вторая развёртка и неподвижность. Запечь — сфотографировать свет.

Запись глубиныDepth write, ZWriteСохранение глубины прошедшего пикселя в буфер, чтобы он закрывал то, что нарисуют после. Непрозрачное пишет глубину, прозрачное — нет.
Затенение от окружения, AOAmbient occlusionДоля неба, которую видит точка: 1 — открытое место, 0 — глубокая щель. Её запекают в текстуру. В Unreal вход AO гасит только непрямой свет, солнце не трогает.
Затенение отраженийSpecular occlusionГасит отражение там, где точка видит мало окружения: в щелях, углах, за шкафом. Его выводят из AO, потому что проба, снятая в одной точке, этого не знает.

Родственный приём — гасить часть отражения, которая из-за карты нормалей смотрит под поверхность. Когда ответа нет.

Зелёный канал: DirectX и OpenGLNormal map Y flipДве договорённости о том, куда смотрит G в карте нормалей. Unreal ждёт DirectX, Blender работает в OpenGL. Если перепутать, выпуклое выглядит вдавленным.
Зеркальное отражение, бликSpecular reflectionСвет, отразившийся от самой поверхности, не заходя внутрь. У неметаллов он цвета источника и слабый, 2–5 % в упор; у металлов окрашен и сильный.
Иерархическая глубина, Hi-ZHierarchical Z, HZBГрубая копия буфера глубины: для блока пикселей хранится самая дальняя глубина. По ней видеокарта отбрасывает целые блоки, а движок — предметы, закрытые целиком.
Иерархический LOD, HLODHierarchical level of detail, HLODДальний уровень для целой группы предметов: квартал домов склеивают в один меш с одним материалом, и вдали он рисуется одним вызовом. Вблизи его сменяют настоящие предметы.
ИмпостерImpostor, billboardПлоская карточка с заранее снятой картинкой предмета, повёрнутая к камере. Два треугольника вместо модели; снимки с разных сторон скрывают плоскость. Последний уровень дальних деревьев.
Инверсия, 1 − xOne MinusПереворачивает маску: белое становится чёрным, чёрное — белым.
Инстанс материалаMaterial instance / variantМатериал без своего графа: ссылка на родителя и переопределённые параметры. Остальное наследуется от родителя. Смена его параметров не требует компиляции.

В Unreal — Material Instance, в Unity — Material Variant (с версии 2022.1). Не путать с инстансингом — рисованием многих копий одним вызовом. Урок

ИнстансингGPU instancingРисование многих копий одного меша с одним материалом за один вызов: у каждой копии только своё положение и немного своих данных. Так рисуют траву, камни, деревья.
ИнтерполяцияInterpolationПлавное смешивание значений между вершинами треугольника: так каждый пиксель получает свои UV, нормаль и цвет.
Искажение координатDomain warpingПеред чтением шума координату сдвигают другим шумом: шум(p + k × шум₂(p)). Соседи сдвинуты почти одинаково, и узор тянется струями — мрамор, разводы, потёки.
Искры бликаSpecular aliasingМерцание бликов на гладкой поверхности с мелкой картой нормалей: шейдер берёт рельеф в одной точке пикселя, и блик вспыхивает и гаснет. MSAA его не лечит; помогают шероховатость в мипах и временное сглаживание.
КаналChannel (R, G, B, A)Одна из составляющих цвета: R, G, B или A. Каждый канал — отдельная чёрно-белая таблица чисел от 0 до 1.
Карта нормалейNormal mapТекстура, в каждом пикселе которой записано направление, а не цвет. Свет рисует по ней мелкий рельеф, которого нет в геометрии. Ровное место — (0.5, 0.5, 1).

Цвет = (стрелка + 1) / 2. Каналы читаются по отдельности: R — наклон влево-вправо, G — вверх-вниз. Подделку выдают силуэт и движение камеры.

Карта полостей, cavityCavity mapКарта мелких щелей и пор. Ею затемняют BaseColor и Specular, потому что в тесную щель не попадает ни свет неба, ни его отражение.
Карта тенейShadow map, shadow mappingБуфер глубины, нарисованный из источника света: в каждом текселе — расстояние от лампы до ближайшей поверхности. Точка в тени, если в карте записано меньше, чем расстояние от неё до лампы.

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

Касательная, TTangentСтрелка на поверхности, которая смотрит туда, куда растёт координата U развёртки. Вместе с бинормалью и нормалью задаёт оси касательного пространства.
Касательное пространствоTangent spaceСистема координат, привязанная к поверхности: X и Y вдоль неё, Z наружу. Карты нормалей обычно записаны в ней, поэтому ровное место в них всегда сиреневое.
Каскадные карты тенейCascaded shadow maps, CSMТени солнца несколькими картами: пространство перед камерой режут по расстоянию на 2–4 куска, у каждого своя карта того же размера. Рядом тексели мелкие, вдали крупные.

Главная ручка качества — дальность теней: все каскады делят её. На границах каскадов видна черта, её прячут смешиванием. Каскады: тени солнца.

КластерCluster, meshletКусочек модели из примерно 128 соседних треугольников. Кластер проверяют на видимость и выбирают ему детализацию целиком — так работают Nanite и другие системы виртуальной геометрии.
Коллекция параметров материаловMaterial Parameter Collection, MPCГлобальные параметры, общие для всех материалов: поменял одно число — изменились все, например мох на всех камнях мира.
Конвейер рендерингаRendering pipelineПуть треугольника на экран: вершинный шейдер, растеризация, интерполяция, пиксельный шейдер, тест глубины и запись в кадр.
Контактные тениContact shadows, screen-space shadowsКороткие тени по буферу глубины кадра: от пикселя шагают к источнику и проверяют, не встало ли что-то на пути. Дают мелочам — пуговицам, камешкам, стыкам — тени, которые меньше текселя карты.

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

КонтрастContrastРазница между светлым и тёмным. Поднять контраст значит развести значения сильнее, по возможности не обрезая края. В композиции слово шире: любая разница с окружением — по размеру, форме, цвету, свету или движению.
Коррекция параллаксаParallax correction, box projectionПоправка кубмапы для комнаты: луч отражения ведут до стены заданной коробки и спрашивают пробу о направлении к этой точке стены. Без неё отражение в комнате плывёт вместе с камерой.

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

Кривая тонаTone curveГрафик операции над каналом: по горизонтали значение до, по вертикали после. По нему видно, что операция делает с тёмным, средним и светлым.
КубмапаCubemap, cube mapШесть квадратных картинок — вид из одной точки вперёд, назад, влево, вправо, вверх и вниз. Читают её по направлению: грань выбирает самое большое число стрелки.

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

Кэш поверхностейSurface cache, mesh cardsУпрощённые «фотографии» каждой модели с нескольких сторон, на которых Lumen хранит материал и свет. Луч, попавший в модель, берёт свет отсюда. Каждый кадр освещают часть карточек, поэтому отскоки копятся по кадрам.
ЛайтмапаLightmapТекстура, в каждом текселе которой записано, сколько света пришло в эту точку поверхности. Цвета в ней нет: шейдер умножает BaseColor на свет из лайтмапы.

Свет меняется плавно, поэтому лайтмапе хватает 10–30 текселей на метр, а кирпичи остаются чёткими в своей текстуре. Лайтмапа: свет отдельно от цвета.

Левая и правая системы координатLeft- and right-handed coordinatesДве договорённости о том, куда смотрит третья ось. Unreal и Unity — левые, Blender и Godot — правые. При переносе между ними одну ось переворачивают, иначе модель выходит зеркальной.
Линейный цветLinear color, linear spaceЧисла, пропорциональные количеству света: вдвое больше число — вдвое больше света. В них свет складывают, умножают, смешивают и размывают; шейдер переводит текстуры цвета в линейные при чтении.
МаскаMaskЧёрно-белая картинка, где каждый пиксель — число от 0 до 1, «сколько». Обычно служит долей t для смешивания.
МасштабируемостьScalabilityОдна сцена с разными уровнями качества для разного железа: у каждой статьи кадра — теней, травы, отражений, пост-обработки, разрешения — своя ручка от «Низко» до «Эпик».
МатериалMaterialШейдер плюс значения его параметров: числа, цвета, текстуры. Код общий, данные у каждого материала свои. Так устроено в любом движке и в Blender.
МеталличностьMetallicПереключатель между двумя рецептами: 0 — диэлектрик (цвет в диффузе, отражение 4 % и бесцветное), 1 — металл (диффуза нет, BaseColor становится цветом отражения). Промежуточные значения — только на переходах.
МикрограньMicrofacetКрошечная плоская грань поверхности, меньше пикселя. Модель PBR считает, что поверхность состоит из таких зеркалец, а шероховатость — это их разброс по наклону.
Мип-мапыMipmapsЗаранее уменьшенные копии текстуры. Вдали видеокарта берёт маленькую копию, чтобы картинка не рябила.
Мировое пространствоWorld spaceКоординаты от начала мира уровня, одни на всех. В них расставляют предметы, в них живут «верх», ветер и солнце.
Модель затененияShading modelФормула, по которой свет ложится на поверхность: обычная, кожа, ткань, волосы, лак. В отложенном рендере набор моделей фиксирован: номер модели хранится в G-буфере.

В Unreal номер модели занимает 4 бита в GBufferB, поэтому моделей не больше 16. Свою модель, например мультяшную, добавляют правкой движка или собирают пост-обработкой по G-буферу.

Мягкое пересечениеDepth fade, soft particlesПрозрачность по разнице глубин: вода, дым и туман плавно гаснут там, где касаются поверхности, вместо жёсткой линии.
Направленная лайтмапаDirectional lightmapЛайтмапа, которая помнит не только сколько света пришло, но и откуда. Тогда карта нормалей на запечённой стене работает. Цена — вторая текстура и вдвое больше памяти.
Непрямой светIndirect light, indirect lightingСвет, который пришёл в точку не от источника, а от других поверхностей и от неба. Он заполняет тени и окрашивает их цветом соседей.
НормальNormalСтрелка длиной 1, перпендикулярная поверхности. Показывает, куда поверхность смотрит, и по ней считается свет.
Объём постобработкиPost Process VolumeНевидимая коробка в Unreal со своими настройками экспозиции, цвета и эффектов для места внутри неё. У границы настройки плавно сменяются (Blend Radius), при пересечении побеждает объём с большим Priority, а с Infinite Extent он действует на весь уровень.
Объёмный туманVolumetric fogТуман, посчитанный в сетке ячеек перед камерой: в каждой — плотность и свет от ламп с учётом теней. Даёт лучи сквозь листву и конусы фонарей. Дорогой, копится по кадрам и может шлейфить.
Однородные координатыHomogeneous coordinatesЧетвёртое число w у координат: 1 у точек, 0 у направлений. Позволяет записать перенос умножением на матрицу 4 × 4, а направления не переносить.
ОктаваOctaveОдин слой в сумме шумов. Каждая следующая октава обычно вдвое мельче и вдвое слабее прошлой — как в музыке, где октава выше значит частота вдвое больше.
Отложенный рендерингDeferred rendering, deferred shadingСначала непрозрачные предметы записывают свойства поверхности в G-буфер, потом отдельный проход считает свет по пикселям экрана — только там, куда достаёт лампа. Цена света не зависит от числа предметов.
Отражённый свет, отскокBounce light, light bounceСвет, который упал на поверхность и отразился дальше. Каждый отскок умножает его на альбедо, поэтому при альбедо 0.5 три отскока дают 87.5 % всего непрямого света.

Светлым интерьерам и снегу нужно больше отскоков: при альбедо 0.8 три отскока дают меньше половины. Почему хватает двух-трёх отскоков.

Отсечение перекрытыхOcclusion cullingОтбрасывание предметов, закрытых другими целиком. Обычно проверяют по уменьшенной глубине (Hi-Z): предмет закрыт, если его ближняя точка дальше самой дальней глубины в клетках, которые он накрывает.
Отсечение по пирамиде камерыFrustum cullingПроверка, попадают ли границы предмета — описанный шар или коробка — в усечённую пирамиду, которую видит камера. Для шара это шесть скалярных произведений со стенками пирамиды.

Проверяют границы, а не модель, поэтому вершины, сдвинутые ветром за границы, могут пропасть раньше времени. Пирамида камеры.

Параметр материалаMaterial parameterЧисло, цвет или текстура, которые инстанс передаёт в готовый шейдер. Одинаковы для всех пикселей и меняются без компиляции.
Перевёрнутая глубинаReversed-ZГлубина во float на 32 бита, где ближняя плоскость — 1, а бесконечность — 0. Дальнее попадает туда, где float точнее, и мерцание вдали почти исчезает.
ПерекрытиеOverdrawСколько раз пиксельный шейдер выполнился для одного места экрана. Прозрачные слои, трава и дым рисуются друг поверх друга и множат работу.
Пересвет, обрезкаClippingЗначение вылезло за 1 или ниже 0 и было обрезано: разные значения стали одинаковыми, и детали пропали.
Перестановка шейдераShader permutationОтдельный вариант шейдера для каждой комбинации статических переключателей, типа меша и прохода. Каждую нужно скомпилировать и хранить.
Перспективное делениеPerspective divideДеление координат на глубину после вершинного шейдера. Из-за него вдвое дальше — вдвое меньше.
ПивотPivot / originНачало координат модели: точка, вокруг которой её вращают и масштабируют и которую ставят в позицию предмета.
Пиксельный шейдерPixel (fragment) shaderВыполняется для каждого пикселя треугольника и решает его цвет и остальные каналы материала. Знает только свои входы и не видит соседних пикселей.
Плоские отраженияPlanar reflectionsСцену рисуют ещё раз из камеры, отражённой относительно плоскости зеркала или воды. Ответ полный, но кадр почти вдвое дороже и только для одной плоскости.
Плотность лайтмапыLightmap density, lightmap resolutionСколько текселей лайтмапы приходится на метр поверхности. Мало — лесенки, пропавшие тонкие тени и протекание под стены; вдвое больше — памяти вчетверо больше.

Лайтмапа 64 на стене в 4 м — 16 текселей на метр, тексель 6 см. Плотность лайтмапы.

Плотность текселейTexel densityСколько пикселей текстуры приходится на метр поверхности. У соседних моделей она должна быть близкой, иначе одна выглядит мыльной.

Считается так: разрешение × доля развёртки / размер предмета. Текстура 2048, предмет 2 м, развёртка на всю текстуру — 1024 текселя на метр.

Подвижность лампыLight mobilityСколько света лампы разрешено запечь. Неподвижная — всё, стационарная — отскоки и тени от неподвижного, подвижная — ничего. Чем больше запечено, тем дешевле и тем меньше можно менять.

У стационарной можно менять яркость и цвет, но не место: отскоки при этом не меняются. Три вида ламп.

Показатель преломленияIndex of refraction, IORВо сколько раз свет в веществе медленнее, чем в пустоте: у воды 1.33, у стекла около 1.5. Из него получается F0 = ((n − 1) / (n + 1))².
Покрытие альфа-тестаAlpha coverage, preserve coverageДоля пикселей, прошедших порог альфа-теста. В уменьшенных копиях текстуры альфа усредняется, покрытие падает, и листва вдали редеет. Сохранение покрытия умножает альфу каждой копии, чтобы доля осталась прежней.

Unity: Mip Maps Preserve Coverage. Unreal: Do Scale Mips for Alpha Coverage. Godot 4.8: Mipmaps → Preserve Alpha Test Coverage.

Поле расстоянийSigned distance field, SDFОбъёмная таблица вокруг модели: в каждой точке записано, как далеко до ближайшей поверхности. Луч идёт по ней прыжками на это расстояние, поэтому быстро, но тонкие стены поле может не заметить.
ПолутеньPenumbraМягкий край тени, где источник закрыт только частично. Ширина — размер источника × высота заслонки / (высота источника − высота заслонки): у основания предмета тень резкая, вдали мягкая.

Солнце видно под углом около 0.53°, поэтому его полутень — примерно сотая доля расстояния от заслонки. Мягкие края.

Пост-обработкаPost-processingПроходы по готовому кадру: туман, свечение, глубина резкости, размытие движения, экспозиция и тонмаппинг. Шейдер здесь видит соседние пиксели, потому что кадр уже нарисован.
Предпроход глубиныDepth prepass, Z-prepassСначала вся непрозрачная геометрия рисуется только в буфер глубины, потом с материалом и тестом «ровно так же». Каждый видимый пиксель считается один раз.
Предфильтрованная кубмапаPrefiltered cubemap, prefiltered environment mapКубмапа, у которой каждый мип-уровень заранее размыт под свою шероховатость: 0 — зеркало, последние — почти матовое пятно. Шейдер выбирает уровень по Roughness, и размытие стоит одну выборку.

Часть приёма «разделённая сумма»: вторая часть — маленькая таблица Френеля и теней микрограней по шероховатости и углу (в Unreal — EnvBRDF). Из-за допущения «смотрим в лоб» пропадают вытянутые отражения. Шероховатость размывает отражение.

ПреломлениеRefractionЛуч света меняет направление на границе двух веществ, потому что в них разная скорость света. Из-за него ложка в стакане кажется сломанной, а дно — ближе, чем есть.
Проба отраженийReflection probe, reflection captureКубмапа, снятая в точке уровня, с областью, где ей пользуются. Снимают заранее или во время игры, редко и по частям: шесть граней — шесть лишних кадров сцены.

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

Проба светаLight probeТочка в воздухе, которая помнит, сколько света приходит к ней с каждой стороны. Движущиеся предметы берут непрямой свет у ближайших проб.

Пробы ставят сеткой и запекают или обновляют на ходу. В Unity проба хранит 27 чисел — по девять на цветовой канал. Сетки проб: Adaptive Probe Volumes в Unity 6, Volume в EEVEE, Volumetric Lightmap в Unreal, пробы LightmapGI в Godot.

Продление цвета под прозрачноеColor dilation, edge paddingПрозрачные пиксели текстуры заливают цветом ближайших краёв, альфу не трогая. Тогда фильтрация и мип-мапы не подмешивают в край чёрный или белый, и тёмной каймы нет.
Прозрачность без сортировкиOrder-independent transparency, OITСпособы правильно смешать прозрачные слои в каждом пикселе без сортировки предметов: хранить и сортировать все слои, снимать их по одному или складывать с весами. Дороже обычной сортировки.
Производные и четвёрки пикселейScreen-space derivatives (ddx, ddy), 2×2 quadsВидеокарта считает пиксели квадратами 2 × 2 и так узнаёт, как быстро меняются UV к соседу. По этому она выбирает уровень мип-мапа.
Пространство камерыView (camera) spaceКоординаты от камеры: вперёд, вправо, вверх. Переход в него — обратный трансформ камеры: двигается не камера, а весь мир.
Пространство объектаObject (local) spaceКоординаты от пивота модели в её собственных осях. Так точки записаны в файле модели, и они не меняются, куда бы предмет ни поставили.
Пространство отсечения, NDCClip space / normalized device coordinatesКоординаты после проекции. После деления на глубину всё видимое лежит от −1 до 1 по x и y, остальное отсекается.
Протекание лайтмапыLightmap bleeding, light bleedingСветлые или тёмные полосы по краям кусков лайтмапы: смешивание соседних текселей захватывает чужой кусок или пустоту. Лечат отступом не меньше двух текселей и продлением краёв.

Отступ меряют в текселях лайтмапы, поэтому при меньшем разрешении та же развёртка начинает протекать. Протекание по швам.

ПрофилировщикProfilerИнструмент, который меряет, сколько заняла каждая часть кадра на процессоре и видеокарте. Искать узкое место — от общего к частному: кто медленнее, какой проход, какой предмет.
Проход рендерингаRender passОдин этап кадра: видеокарта рисует что-то в свою картинку — глубину, G-буфер, свет, пост-обработку. Следующие проходы читают эту картинку как текстуру.

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

Прыжок LODLOD poppingЗаметная смена формы модели в момент переключения уровня детализации. Смягчают близкими уровнями, запасом между порогами вниз и вверх и плавным переходом дизерингом.
Прямой рендерингForward rendering, forward shadingСвет считают сразу, когда рисуют предмет: пиксельный шейдер перебирает лампы, выбранные для всего предмета. Дружит с прозрачным и MSAA, но много ламп на большом предмете обходится дорого.
Прямой светDirect light, direct lightingСвет, который пришёл в точку прямо от источника: солнца, лампы, фонаря. Он даёт резкие тени: точка либо видит источник, либо нет.
РазвёрткаUV unwrapМодель, разрезанная и разложенная на плоскость, как выкройка. Из неё берутся адреса UV.
Развёртка для лайтмапыLightmap UVs, UV2Отдельная развёртка модели для лайтмапы: все куски внутри 0…1, без тайлинга и наложений, с отступами в текселях лайтмапы. Первая для этого не годится: у неё повторы и общие куски.

В Unreal обычно канал 1 (счёт с нуля), в Unity и Godot — UV2. Вторая развёртка.

Размытие в движенииMotion blurСлед за быстрым предметом, как на фото с выдержкой: каждый пиксель размывают вдоль его вектора движения. Длину задают долей кадра, как угол затвора. Съедает детали и может укачивать.
Ранняя проверка глубиныEarly-Z, early depth testТест глубины до пиксельного шейдера: закрытые пиксели отбрасываются, и работа на материал не тратится. Хуже работает, если шейдер сам пишет глубину или выбрасывает пиксели.
Рассеяние МиMie scatteringРассеяние на частицах размером с длину волны и крупнее: пыль, пыльца, дым, капли. Рассеивает все цвета почти поровну и в основном вперёд, поэтому дымка белёсая, облака белые, а вокруг солнца ореол.
Рассеяние РэлеяRayleigh scatteringРассеяние света на частицах намного меньше длины волны, например на молекулах воздуха. Растёт обратно четвёртой степени длины волны: синий отлетает почти в 6 раз чаще красного, поэтому небо голубое, а низкое солнце красное.
РастеризацияRasterizationЭтап, на котором видеокарта находит пиксели, центры которых попали внутрь треугольника. Её выполняет железо, программировать её не нужно.
Растяжение UVUV stretchingКусок развёртки непропорционален своему месту на модели, и текстура на нём вытянута. Видно по проверочной клетке.
Режим повтораAddress mode: Wrap, Clamp, MirrorЧто делать, если UV вышел за 0..1: повторить текстуру (Wrap), растянуть крайний пиксель (Clamp) или отразить (Mirror).
Режим смешиванияBlend modeКак новый цвет пикселя ложится на уже нарисованный: заменяет его (Opaque), заменяет или выбрасывается по порогу (Masked), смешивается (Translucent, Additive, Modulate).
Свет небаSky light, environment lightingОсвещение панорамой неба: грань, смотрящая вверх, получает голубое небо, смотрящая вниз — отражённую землю. Сам он не знает о стенах, поэтому без AO и закрытия неба светит и в пещеры.
СвечениеBloom, glowОреол вокруг ярких мест, как от рассеяния света в объективе и глазу: кадр размывают на нескольких масштабах и подмешивают к исходному. Делают в HDR до тонмаппинга, чтобы ярче источник — шире ореол.
СглаживаниеAnti-aliasing, AAСпособы бороться с алиасингом. Идея у всех одна: больше проб на пиксель, в одном кадре или по нескольким, и смешать их.

Суперсэмплинг, MSAA, постфильтры FXAA и SMAA, временное сглаживание и апскейлеры. Как сглаживают.

Сглаживание нормалейSmooth shadingНормали в вершинах усредняют и плавно смешивают внутри треугольника, поэтому гранёная модель выглядит гладкой. Жёсткое ребро — где нормали нарочно разделены.
Сжатие текстур BCBlock compression: BC1, BC3, BC4, BC5, BC7Форматы, в которых видеокарта хранит текстуры сжатыми блоками 4 × 4 одного размера и читает любой тексель без распаковки. BC1 — цвет и три маски, BC3 и BC7 — с альфой, BC4 — одна маска, BC5 — нормали.
След пикселяPixel footprintУчасток текстуры, который накрывает один пиксель экрана. Его размер задаёт уровень мип-мапа, а вытянутость под острым углом — число проб анизотропной фильтрации.
Сложение цветовAddРаботает как свет: два фонарика на одной стене дают пятно ярче каждого. Нейтральное значение — 0. Сумма легко перевалит за 1.
Сложение, режим AdditiveAdditive blendingНовый цвет прибавляется к нарисованному: так ведёт себя свет. Чёрное невидимо, затемнить нельзя, порядок слоёв не важен, поэтому огонь и искры можно не сортировать.
Слои материалаMaterial LayersСистема Unreal, где поверхность собирают в инстансе стопкой слоёв: каждый слой — целая поверхность (камень, ржавчина, снег), а смешивание по маске кладёт верхний на нижний. Каждый слой считается полностью, поэтому слои дороже фиксированного мастера.
Смешивание «поверх»Alpha blending, overНовый цвет смешивается с уже нарисованным: новое × α + старое × (1 − α). Это lerp, и результат зависит от порядка слоёв, поэтому прозрачное сортируют.
Смешивание по высотеHeight blendLerp двух материалов, у которого маску сдвигает карта высоты: верхний слой проступает сначала на выступах или в щелях, и граница идёт по рельефу, а не размытым пятном.

Простая запись: t = saturate(h + 2 × m − 1), потом контраст и lerp(A, B, t). При маске 0 остаётся нижний слой, при 1 — верхний. В Unreal — функция HeightLerp со входами Transition Phase и Contrast.

Смешивание проекцийProjection blending, blend sharpnessВеса трёх проекций из нормали: модули |n.x|, |n.y|, |n.z| возводят в степень k и делят на их сумму, чтобы вместе было 1. Чем больше k, тем уже переход; при огромном k — кубическая проекция со швами.

Без деления на сумму рёбра светлеют (на 45° — на 41 %) или темнеют. Веса берут из нормали меша, а не из карты нормалей. Модуль, степень и сумма 1.

Смещение вершин, WPOWorld Position OffsetВход материала, который сдвигает каждую вершину в вершинном шейдере. Так качаются трава и волны. Коллизию и границы объекта он не меняет.
Смещение глубиныDepth bias, polygon offsetНебольшая поправка к глубине пикселя при растеризации: геометрия стоит на месте, а тест считает её чуть ближе или дальше. Лечит мерцание наклеек и полосы на тенях.
Смещение мип-мапаMip bias, texture LOD biasЧисло, которое прибавляют к номеру выбранного уровня мип-мапа. Плюс — мельче уровень: мягче и дешевле. Минус — крупнее: резче, но возвращается рябь. TAA и апскейл сдвигают в минус сами.
Смещение тениShadow bias, slope bias, normal biasНебольшой сдвиг точки к лампе или наружу по нормали перед сравнением с картой теней, чтобы поверхность не затеняла саму себя. Слишком большое смещение отрывает тень от предмета.

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

Сортировка прозрачногоTransparency sortingПрозрачные предметы рисуют после непрозрачных, от дальнего к ближнему, упорядочив по одной точке — обычно центру габаритов. Ошибается на пересечениях, больших предметах и треугольниках одной модели.
Сохранение энергииEnergy conservationПоверхность не отражает больше света, чем на неё упало. Поэтому у шероховатой поверхности блик шире, но тусклее, а у металла нет диффуза.
Статический переключательStatic SwitchВыбор ветки графа ещё при сборке шейдера. Выключенная ветка ничего не стоит, но каждая комбинация переключателей — отдельный шейдер.
СтепеньPowerx в степени p. На значениях от 0 до 1 при p больше 1 затемняет середину, меньше 1 — осветляет, а 0 и 1 не двигает. Так делают контраст маски.
Степень двойкиPower of two, POT / NPOTРазмер текстуры вида 256, 512, 1024, 2048: сторона делится пополам до 1, и цепочка мип-мапов ложится ровно. Стороны могут различаться: 2048 × 512 — тоже степени двойки.
Стриминг текстурTexture streaming, mipmap streamingДвижок держит в видеопамяти только те мип-мапы текстур, которые нужны кадру по размеру на экране, и догружает подробные по мере приближения. Если пул переполнен, текстуры остаются мыльными.
Ступень экспозиции, EVExposure value (EV), stopУдвоение света. +1 EV — в кадр пускают вдвое меньше света: ясному дню подходит около EV 15, вечерней комнате — около EV 5. Освещённость в люксах при ISO 100: E = 2,5 × 2^EV.
СуперсэмплингSupersampling, SSAAКадр рисуют в большем разрешении и уменьшают, усредняя соседей. Шейдер считается в каждой пробе, поэтому лечится любой алиасинг, но и работы во столько же раз больше.
ТайлингTilingПовторение текстуры: UV умножают на число N, и текстура повторяется N раз по каждой стороне — каждая копия в N раз мельче.
Тайловый рендерингTile-based rendering, TBDRМобильные видеокарты рисуют экран небольшими плитками в быстрой памяти. Видеокарты Apple и PowerVR сначала находят ближайший треугольник в каждом пикселе плитки и только потом запускают шейдер.
ТексельTexelПиксель текстуры.
ТекстураTextureКартинка, которую материал читает как таблицу чисел: там может быть цвет, направления нормалей или маски.
Текстура глубиныDepth texture, scene depthБуфер глубины, который читают как текстуру после непрозрачного: прозрачные материалы и пост-обработка узнают по нему, насколько далеко видимая поверхность.
Теневые прыщиShadow acneПолосы и рябь на освещённой поверхности: она затеняет сама себя, потому что тексель карты хранит глубину своего центра, а поверхность внутри текселя уходит дальше от лампы.

Сильнее всего при скользящем свете. Лечится смещением тени — по наклону или по нормали. Теневые прыщи.

Тест глубиныDepth test, ZTestСравнение глубины нового пикселя с записанной в буфере: пиксель проходит, только если он ближе (или как настроено сравнение).
ТинтTintЦвет, которым окрашивают текстуру, чтобы сменить её оттенок, чаще всего умножением.
ТонмаппингTonemapping, tone mappingКривая, которая переводит любую яркость HDR-кадра от 0 до бесконечности в 0…1 экрана: тени чуть темнее, середина почти прямо, яркое плавно сжимается к белому, как на плёнке. Без неё всё ярче 1 обрезается в одинаковое белое.

Применённая к каждому каналу, кривая белит яркие насыщенные цвета: огонь желтеет. ACES, Filmic, AgX, Рейнхард — разные кривые. Тонмаппинг.

Точность координат, LWCFloating-point precision / Large World CoordinatesУ float около семи значащих цифр: вдали от начала мира шаг чисел растёт, и модели дрожат. Unreal 5 хранит мировые позиции в double — это Large World Coordinates.
ТрансформTransformПеренос, поворот и масштаб предмета. Применяются в порядке масштаб → поворот → перенос и хранятся как одна матрица.
Трассировка лучейRay tracingПоиск первого, во что упрётся луч, по самой сцене, а не по экрану. Сцену раскладывают по вложенным коробкам, видеокарты ищут пересечения на отдельных блоках. Лучей мало — картинка шумная, её сглаживает шумодав.

Так считают тени, отражения и непрямой свет. Lumen сначала ищет ответ на экране, потом — по упрощённой копии сцены. Лучи и Lumen, Тени лучами.

Трилинейная фильтрацияTrilinear filteringБилинейная выборка из двух соседних уровней мип-мапа, смешанная по дробной части номера уровня. Без неё на полу видны рубежи, где резкость меняется скачком.
Убер-шейдерUber shaderОдин большой шейдер на всё с множеством переключателей. Удобно начинать, но трудно поддерживать, а число его вариантов растёт как степень двойки.
Угол обзора, FOVField of viewСколько градусов мира помещается в кадр. Узкий угол работает как зум. В Unreal он горизонтальный, в Unity по умолчанию вертикальный.
Умножение цветовMultiplyРаботает как фильтр, цветное стекло: каждый канал проходит на свою долю. Нейтральное значение — 1. Числами от 0 до 1 только затемняет.

Так тонируют текстуры и так свет ложится на поверхность: цвет = BaseColor × свет. Красное яблоко под синим светом чёрное, потому что (1, 0, 0) × (0, 0, 1) = (0, 0, 0).

Умножение, режим ModulateModulate, multiply blendingНовый цвет умножает нарисованный: так работает фильтр — витраж, солнечные очки, грязь. Белое невидимо, осветлить нельзя, порядок слоёв не важен.
Упаковка каналовChannel packingНесколько чёрно-белых масок в каналах R, G, B и A одной текстуры: одна выборка вместо трёх и втрое меньше памяти. Порядок каналов — договорённость пака, сама текстура — данные без sRGB.

Самая частая упаковка — ORM: AO, шероховатость, металл. Важное кладут в зелёный канал, он точнее в BC1; четвёртая маска в альфе удваивает память. Урок про упаковку каналов.

Упор в видеокартуGPU-boundКадр задаёт видеокарта, а процессор её ждёт. Если кадр ускоряется от снижения разрешения — упор в пиксели; если нет — в вершины или карты теней.
Упор в процессорCPU-boundКадр задаёт процессор: логика, физика или подготовка вызовов отрисовки дольше, чем работа видеокарты, и она простаивает. Снижение разрешения тогда не помогает.
Уровни детализации, LODLevel of detail, LODНесколько версий модели: полная для близи и всё более простые для дали. Движок переключает их по размеру предмета на экране, а не по метрам, чтобы на пиксель приходилось примерно одинаково треугольников.
Фабрика вершинVertex factoryКусок шейдера, который получает вершины для одного типа меша: обычного, скелетного, инстансов, Nanite, частиц. Для каждой фабрики материал компилирует свой набор шейдеров.
Фильтрация текстурTexture filteringКак видеокарта берёт цвет между центрами текселей: ближайший тексель (квадраты) или смешивание четырёх соседей (билинейная).
Флаги UsageMaterial usage flagsГалочки мастер-материала в Unreal: с какими мешами он работает. Каждая добавляет набор шейдеров для своей фабрики вершин. Без нужного флага собранная игра рисует предмет материалом по умолчанию — серо-белой клеткой.

Редактор ставит флаги сам (Automatically Set Usage in Editor), но они сохраняются только вместе с материалом. В мастерах с множеством инстансов автоматическую галочку выключают: лишний флаг умножается на все сочетания переключателей.

Фрактальный шум, fBmFractional Brownian motion, fBmСумма октав одного шума: каждая следующая в lacunarity раз мельче (обычно 2) и в persistence раз слабее (обычно 0.5). Крупная форма плюс всё более мелкие неровности — рельеф, похожий сам на себя в любом масштабе.

Сила вдвое меньше при частоте вдвое больше, потому что в природе высота бугра примерно пропорциональна его ширине. Октав есть смысл добавлять, пока самая мелкая не меньше двух пикселей. Модуль каждой октавы даёт складки (Turbulence), перевёрнутый модуль — гребни (ridged).

Функция материалаMaterial FunctionКусок графа материала со своими входами и выходами, который вставляют в разные материалы одной нодой. Сама ничего не стоит: её ноды становятся частью кода материала. Правка функции перекомпилирует все материалы, где она стоит.
Цвет вершинVertex colorЦвет, записанный прямо в вершины модели. Его рисуют кистью и используют как маску, например чтобы стереть мох в нужном месте.
Цветовое пространствоColor spaceДоговорённость, что означают три числа цвета: какие красный, зелёный и синий считать основными, какой белый — белым и по какой кривой числа связаны со светом. Текстуры игр почти всегда в sRGB.
ЦветокоррекцияColor gradingПокраска готового кадра: баланс белого, насыщенность, контраст, кривые, отдельные тона для теней и светов. До тонмаппинга работает со светом, после — с экранными числами. Часто запекается в LUT.
Цель рендерингаRender targetКартинка в памяти видеокарты, в которую проход рисует вместо экрана. Потом её читают как текстуру. Экран — последняя цель кадра, буфер глубины — одна из первых.

В Unreal есть и ассет Render Target — такая же картинка, в которую можно рисовать самому: вид с камеры наблюдения, следы на снегу.

ШейдерShaderПрограмма для видеокарты, которая выполняется отдельно для каждой вершины или каждого пикселя. Граф материала в Unreal — это шейдер, нарисованный нодами.
ШероховатостьRoughnessНасколько вразнобой наклонены микрограни: 0 — зеркало, 1 — полностью матовая поверхность. Чем выше, тем шире и тусклее блик.

Обратная величина в старых пайплайнах — глянец (glossiness = 1 − roughness). В формуле блика используют α = Roughness², чтобы ползунок работал на глаз равномерно. Урок

Шероховатость из нормалей, ToksvigToksvig, normal-to-roughnessПоправка мип-мапов: где усреднённые стрелки нормалей стали короче, шероховатость поднимают. Рельеф мельче пикселя превращается в матовость, а не в зеркало, и блик вдали не искрит.

В Unreal — Composite Texture у текстуры шероховатости, в Godot — Roughness → Src Normal при импорте. Нормали укорачиваются.

ШлейфGhostingПолупрозрачный след за движущимся предметом при временном сглаживании: история не отброшена, и прошлые кадры подмешиваются к новым. Чаще всего у предмета нет верных векторов движения.
ШовUV seamРебро, по которому разрезали модель при развёртке. Рисунок на шве может не совпасть, поэтому швы прячут.
ШумNoiseФормула, которая по координатам выдаёт случайный, но плавный узор: соседние точки похожи, далёкие — нет. Из шума делают маски мха, грязи, облака и рельеф.

Белый шум — своё число в каждом пикселе, зерно. Шумы для материалов кладут случайные числа только в узлы сетки и плавно переходят между ними (value noise, Perlin) или считают расстояние до случайных точек (Voronoi). Несколько слоёв разного размера складывают в октавы.

Шум Перлина, градиентный шумPerlin noise, gradient noiseШум, у которого в узлах сетки лежат случайные наклоны, а не высоты. В каждом узле значение — середина, холмы и впадины между узлами, поэтому сетка почти не видна.

Вклад угла — скалярное произведение его наклона на стрелку от угла к точке; четыре вклада смешивают плавной долей. Simplex — та же идея на треугольниках: три угла вместо четырёх в 2D и четыре вместо восьми в 3D.

Экранное пространствоScreen spaceГде точка оказалась на экране: пиксель по горизонтали и вертикали плюс глубина. Нужно для эффектов по кадру и для интерфейса.
Экранные отражения, SSRScreen space reflections, SSRОтражения по готовому кадру: луч идёт шагами, и каждую точку сравнивают с буфером глубины. Упёрся в видимую поверхность — берут её цвет из кадра.

Точные и с движущимся, но не видят того, что за краем кадра, за предметами и позади камеры. Предметам задают толщину: мала — отражение рвётся, велика — лишние хвосты. Экранные отражения.

ЭкспозицияExposureСколько света камера пускает в кадр. Движок делит свет, посчитанный в HDR, на одно число, чтобы нужная часть яркостей поместилась на экран. +1 EV — вдвое меньше света.

Ясному дню подходит около EV 15, вечерней комнате — около EV 5. Автоэкспозиция подстраивает её по яркости кадра, как глаз. Сколько света: солнце против комнаты. Автоэкспозиция.

Экспоненциальный туманExponential fog, distance fogТуман, где каждый метр гасит одну и ту же долю дошедшего света: доля предмета = exp(−плотность × расстояние), остальное — цвет тумана. Считают по расстоянию до точки, а не по глубине.
Эффект Питера ПэнаPeter-panningТень отрывается от основания предмета, и он будто висит над полом. Причина — слишком большое смещение тени: точки пола у основания считаются освещёнными.

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

Эффект ФренеляFresnel effectЧем более вскользь смотришь на поверхность, тем больше она отражает: в упор вода отражает 2 %, у горизонта — почти всё. Отсюда светлая кайма по краю предметов.

В играх считают по приближению Шлика: F = F0 + (1 − F0) × (1 − cos θ)⁵. Урок

Alpha to coverageAlpha to coverageПри сглаживании MSAA альфа решает, сколько точек-проб пикселя закрыть: при α = 0.5 — половину. Край маски становится мягче без сортировки. Работает только с MSAA.
BaseColor, альбедоBase color / AlbedoЦвет поверхности без света и теней: какую долю каждого канала она возвращает диффузом. У металлов BaseColor — это цвет отражения, F0.
BC1 (DXT1)BC1, DXT1Сжатие блоками 4 × 4 за 8 байт: два опорных цвета 5-6-5 бит и номер одного из четырёх оттенков у каждого пикселя. 4 бита на тексель, в восемь раз меньше несжатой. Зелёный точнее, а упакованные маски делят одну палитру.

Палитра блока — четыре точки на отрезке между опорными цветами, номер у пикселя один на три канала. Поэтому несвязанные маски в BC1 мешают друг другу. Как устроен блок.

BC4BC4, ATI1, RGTC1Сжатие одного канала блоками 4 × 4 за 8 байт: два опорных числа по 8 бит и восемь ступеней в блоке. Для одиночной маски. Такой же блок хранит альфу в BC3.
BC5BC5, ATI2, 3Dc, RGTC2Два независимых канала BC4 в одном блоке, 16 байт на 4 × 4. Формат карт нормалей: x и y хранятся точно, z шейдер досчитывает. Годится и для двух масок.
BC7BC7, BPTCКачественное сжатие цвета с альфой или без, 16 байт на блок 4 × 4 — вдвое больше BC1. Восемь режимов, блок можно делить на части со своими палитрами, поэтому каналы мешают друг другу намного меньше. Сжимается медленно.
BRDF, функция отраженияBidirectional reflectance distribution functionФормула, которая говорит, сколько света, пришедшего с одного направления, поверхность отправит в другое. В играх это Ламберт для диффуза и модель микрограней для блика.
Component MaskComponent Mask, swizzleОперация в материале, которая берёт из набора чисел только нужные каналы: R, G, B или A. Так разбирают упакованную текстуру и отрезают лишнее.

В Unreal — нода Component Mask с галочками R, G, B, A; выбрать канал в инстансе позволяет Channel Mask Parameter. В Blender — Separate Color. Справка по нодам.

F0, отражение в упорReflectance at normal incidence, F0Доля света, которую поверхность отражает, если смотреть на неё прямо. У неметаллов 2–5 %, обычно берут 4 %; у металлов 50–100 % и разная по каналам.
Forward+ и кластерный светForward+, tiled and clustered shadingПрямой рендеринг со списками ламп: экран делят на плитки, а кластерный — ещё и по глубине, и каждый пиксель перебирает только лампы своей плитки. Много ламп без G-буфера.
FXAA и SMAAFast approximate anti-aliasing; subpixel morphological anti-aliasingСглаживание готового кадра: ищет резкие перепады яркости и размывает вдоль края. Дёшево, но не возвращает пропавшие детали и не знает прошлых кадров, поэтому мерцание остаётся.

SMAA узнаёт форму ступенек и мылит меньше FXAA. FXAA и SMAA.

G-буферG-buffer, geometry bufferНесколько картинок размером с экран, где для каждого пикселя записаны свойства видимой поверхности: цвет, нормаль, шероховатость, металличность, AO. Отложенный рендер считает свет по ним.

Каналов у картинки четыре, поэтому поля укладывают плотно: в Unreal нормаль лежит в GBufferA, Metallic, Specular и Roughness — в GBufferB, BaseColor и AO — в GBufferC. Посмотреть поля — View Mode → Buffer Visualization. Как упакован G-буфер.

HDRHigh dynamic rangeЗначения ярче 1: свет солнца, свечение. Их считают внутри шейдера и сжимают до диапазона экрана на последнем шаге кадра.
HLSLHigh-Level Shading LanguageЯзык шейдеров, похожий на C. Граф материала в Unreal превращается в код на HLSL, а нода Custom позволяет писать его прямо в графе.
LumenLumenГлобальное освещение и отражения Unreal, которые считают каждый кадр по упрощённой копии сцены: карточки с материалом, поля расстояний или аппаратные лучи. Всё может меняться, но свет запаздывает, шумит и протекает сквозь тонкие стены.

Когда Lumen включён, лайтмапы скрыты, а неподвижные лампы не светят. Цена — около 4 мс кадра при 60 к/с. Живой непрямой свет, Лучи и Lumen.

LUT, таблица цветаLookup table, color LUTТаблица «этот цвет — в этот», куда запекают любую цепочку правок цвета. Это кубик 16³ или 32³ узлов, между узлами цвет смешивают; в Unreal кубик 16³ лежит полоской 256 × 16. Верна только для кадра, по которому её красили.
MikkTSpaceMikkTSpace tangent basisОбщий стандарт расчёта касательных. Если бейкер и движок оба считают по нему (и с той же триангуляцией), карта нормалей читается ровно так, как её запекли.
MSAAMultisample anti-aliasingСглаживание краёв: видеокарта проверяет покрытие пикселя в нескольких точках, обычно в четырёх, и смешивает цвет на краях, а шейдер считает раз на пиксель. Дёшево в прямом рендере, неудобно в отложенном.
NaniteNanite, virtualized geometryСистема Unreal Engine 5: режет модель на кластеры по 128 треугольников, строит из них пирамиду упрощений и каждый кадр выбирает для каждого кусочка уровень с ошибкой меньше пикселя. Мелкие треугольники растеризует своей программой.
ORM, ARM, RMAORM texture, packed masksТекстура, где в каналах лежат три маски материала. ORM и ARM: R — AO, G — шероховатость, B — металл. Другие паки кладут их в другом порядке, поэтому раскладку проверяют по каналам.

Раскладка ORM пришла из glTF и её ждут Godot и экспорт Substance Painter для Unreal. RMA встречается в паках: R — шероховатость, G — металл, B — AO. Mask Map в Unity HDRP: R — металл, G — AO, B — маска детали, A — гладкость. Буквы зависят от пака.

Overlay, перекрытиеOverlay blendСмешивание, которое красит и сохраняет контраст: тёмное темнеет, светлое светлеет. Нейтральное значение — 0.5.
PBR, физически корректный рендерингPhysically based renderingПодход, при котором материал описывает вещество — цвет, шероховатость, металличность, — а свет по этим числам считает движок. Поэтому один материал правильно выглядит при любом освещении.
PCF и PCSSPercentage-closer filtering, percentage-closer soft shadowsPCF сравнивает с картой теней несколько соседних текселей и берёт долю затенённых — край мягкий, но одинаково везде. PCSS сначала оценивает полутень по высоте заслонки и размывает на неё.
Premultiplied alphaPremultiplied alphaЗапись, где цвет заранее умножен на альфу: (R × A, G × A, B × A, A). Фильтрация и смешивание с ней честные, без тёмной каймы, а один материал может и закрывать, и светить.

Формула смешивания: новое + старое × (1 − α). В Unreal это режим AlphaComposite, в Unity — Premultiply, в Godot — Premultiplied Alpha.

PSO, кэш шейдеровPipeline State ObjectГотовая связка шейдеров и настроек видеокарты. Если её не собрать заранее, драйвер собирает её посреди игры, и кадр подтормаживает.
RNM, переориентация нормалейReoriented Normal MappingПравильный способ смешать две карты нормалей: деталь поворачивают вслед за крупной формой. В Unreal это нода BlendAngleCorrectedNormals.
Saturate, обрезка до 0..1Saturate / ClampОперация, которая обрезает значение: меньше 0 становится 0, больше 1 — единицей. Её ставят после сложения и контраста, перед lerp.
Screen, осветлениеScreen blendРежим смешивания 1 − (1 − A) × (1 − B): умножение, вывернутое наизнанку. Светлит, как два проектора на одной стене, но не выше 1. Нейтральное значение — чёрный.
sRGBsRGBЗапись цвета по кривой, похожей на чувствительность глаза: тёмным оттенкам достаётся больше ступеней. Галочку sRGB ставят только у цвета, который видит глаз; нормали, шероховатость и маски — данные, и кривая их искажает.
SSAOScreen-space ambient occlusionЗатенение щелей по кадру: для пикселя смотрят глубину соседей, и если многие ближе к камере, точка в яме и непрямой свет гасят. Видит только экран: пропадает у краёв, даёт кайму вокруг персонажей.
SubstrateSubstrateСистема материалов Unreal, в 5.7 и новее включённая в новых проектах по умолчанию. Поверхность описывают слоями-плитами (Slab), которые можно класть друг на друга, вместо фиксированного списка моделей затенения.
Triplanar, трипланарная проекцияTriplanar mappingТекстура без развёртки: три проекции вдоль осей мира X, Y и Z смешиваются по нормали — больше от той, на которую поверхность смотрит прямее. Скалы и утёсы без швов и растяжения, но каждая текстура читается трижды.

Веса — модули компонент нормали в степени k, поделённые на сумму. Карту нормалей переводят в мир по осям каждой проекции. Дешевле — две проекции (biplanar) или одна с дизерингом. Три проектора, цена.

TSRTemporal Super ResolutionСглаживание и апскейл Unreal 5, включено по умолчанию: временное сглаживание, которое ещё и собирает полное разрешение из кадра меньшего размера. Работает на любой современной видеокарте.
Uniform, константы шейдераUniform / constant bufferМаленький блок памяти видеокарты с параметрами материала: одни и те же числа для всех пикселей одного вызова отрисовки. Сменить параметр — записать туда другие числа.
UVUV coordinatesАдрес точки модели в текстуре: две доли от 0 до 1, которые хранятся в вершинах.
Value noise, шум значенийValue noiseШум из случайных чисел в узлах сетки, плавно смешанных внутри клетки lerp-ами через smoothstep. Самый дешёвый плавный шум, но светлые и тёмные пятна сидят на узлах, и сетка заметна.
Voronoi, клеточный шумVoronoi, Worley, cellular noiseШум из расстояния до ближайшей случайной точки: картинка делится на клетки, как камни мостовой или чешуя. F1 — расстояние до ближайшей точки, F2 − F1 равно нулю на границах и рисует трещины.

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

World-aligned текстураWorld-aligned texture, planar projectionТекстура, адрес которой — мировые координаты пикселя, делённые на размер плитки, а не развёртка. Соседние предметы стыкуются без швов, но одна проекция сверху тянется на стенах, а на движущемся предмете рисунок плывёт.

Растяжение проекции сверху — 1 / |n.z|: на склоне 60° вдвое, на стене — полосы. Для того, что движется, координаты берут в пространстве объекта. Проектор вместо развёртки.

Z-fighting, мерцание глубиныZ-fightingПолосы и рябь там, где две поверхности почти совпали: буфер глубины их не различает, и победителя в пикселе выбирает округление.

Математика и физика

109 терминов
АмплитудаAmplitudeРазмах волны: на сколько значение уходит от середины в каждую сторону. В формуле центр + амплитуда × sin(…) — множитель перед синусом.
Барицентрические координатыBarycentric coordinatesТри доли, с которыми вершины треугольника входят в точку внутри него, в сумме 1. Доля вершины — площадь треугольника напротив неё, делённая на площадь всего. По ним видеокарта смешивает UV, нормали и цвета вершин.
Бит и байтBit, byteБит — одна ячейка памяти, 0 или 1. Байт — восемь бит. n бит дают 2 в степени n значений: 8 бит — 256, 16 — 65 536, 32 — около 4.3 миллиарда.

Двоичная запись устроена как обычная, только места стоят не 1, 10, 100, а 1, 2, 4, 8: 13 = 8 + 4 + 1, то есть 1101. Число, буква или цвет — вопрос договорённости, как читать ряд бит.

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

Бросок шара радиуса R — тот же луч, только стены отодвинуты на R, а шары раздуты на R.

ВекторVectorШаг «сколько пройти и куда», записанный числами: (x, y) или (x, y, z). Места у вектора нет, есть направление и длина. Скорость, нормаль, направление на солнце, даже цвет — векторы.
Векторное произведениеCross productСтрелка поперёк двух стрелок a и b длиной с площадь параллелограмма на них: |a| × |b| × sin θ. Сторону выбирает правило руки, поэтому b × a = −(a × b). На плоскости это одно число a.x × b.y − a.y × b.x — площадь со знаком: плюс, если b левее a.

Каждая компонента a × b — площадь тени параллелограмма на плоскость двух других осей: z — тень на пол. Им находят нормаль треугольника, «слева или справа», оси камеры и момент силы.

Взвешенный выборWeighted randomСлучайный выбор, где у вариантов разные веса. Веса откладывают отрезками на линейке и бросают на неё точку. Доля варианта — его вес, делённый на сумму всех весов.
Волны ГерстнераGerstner wavesВолны, у которых точки поверхности ходят по кругу, а не только вверх-вниз: гребни острые, впадины пологие. Крутизна задаёт сдвиг по горизонтали.

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

Время кадра, ΔtDelta timeСколько времени прошло с прошлого кадра: при 60 кадрах в секунду около 0.0167 с. На него умножают всё, что задано «в секунду», чтобы движение не зависело от частоты кадров.
Время удараTime of impact (TOI)Доля шага, на которой два тела впервые коснулись. Для шаров — первый корень квадратного уравнения |d + w·t|² = R², для сложных форм — осторожными прыжками.
Выпуклая оболочкаConvex hullСамый плотный выпуклый многогранник вокруг модели — как резинка, натянутая на гвозди: ложится по выступам и перескакивает впадины.

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

Глубина проникновенияPenetration depthНа сколько тела успели войти друг в друга за шаг физики. Их разводят вдоль нормали контакта на эту глубину, обычно мягко и не до конца.
ГравитацияGravityПритяжение Земли: вес = масса × 9.81 м/с². Масса сокращается, поэтому без воздуха всё падает с одним ускорением. В Unreal — −980 см/с² по z.

В играх гравитацию часто выводят из высоты h и времени подъёма прыжка t: g = 2h / t², скорость отрыва 2h / t. Обычно она в несколько раз сильнее земной, а после вершины прыжка её ещё увеличивают.

Длина вектораVector length, magnitudeСколько по прямой проходит шаг: √(x² + y² + z²), теорема Пифагора. Длина вектора между двумя точками — расстояние между ними.
Единичная матрицаIdentity matrixМатрица, которая ничего не меняет: оси остались на месте, x′ = (1, 0), y′ = (0, 1). Для матриц — то же, что умножение на 1.
Единичный векторUnit vectorВектор длиной 1 — чистое направление. Нормали и направления на свет держат единичными, чтобы скалярное произведение давало косинус.
Единичный кругUnit circleКруг радиуса 1 с центром в начале координат. Точка на нём под углом a — (cos a, sin a), и до центра от неё всегда 1: cos² + sin² = 1.
ЖёсткостьStiffnessСколько ньютонов даёт пружина на каждый метр отклонения. Жёстче — чаще качается: ω = √(жёсткость / масса).

Художнику удобнее задавать частоту f: жёсткость = масса × (2π × f)². Пружина 100 Н/м с грузом 1 кг качается 1.6 раза в секунду.

Закон АрхимедаArchimedes' principleПогружённое тело выталкивается вверх с силой, равной весу воды, которая была бы на месте его подводной части. Литр под водой — около 9.8 Н вверх.
Закон ГукаHooke's lawСила пружины пропорциональна отклонению от точки покоя и направлена обратно: F = −k × x. Растянул вдвое дальше — тянет вдвое сильнее.
ЗатуханиеDampingУпрощённое сопротивление в движках: каждый шаг скорость умножают на число чуть меньше единицы. Масса не важна, торможение идёт по экспоненте.

В Godot каждый шаг скорость × (1 − затухание / шагов в секунду). С гравитацией выходит предельная скорость g / затухание. Linear Damping гасит движение, Angular Damping — вращение.

ИмпульсImpulseСила × время её действия. Меняет скорость сразу на импульс / масса. Им задают разовые события: удар, прыжок, взрыв.

Импульс каждый кадр зависит от частоты кадров, а сила, данная один раз, почти ничего не делает. Галочка Vel Change игнорирует массу. Отдача: импульс пули вперёд равен импульсу ружья назад.

КватернионQuaternionПоворот четырьмя числами: ось, умноженная на синус половины угла, и косинус половины угла. Длина 1. q и −q — одна поза. Повороты склеивают умножением и смешивают slerp, шарнирного замка нет.

Половина угла — потому что точку поворачивают «бутербродом» q × p × q⁻¹: кватернион действует дважды, и каждый раз на половину. Поворот на 360° даёт −q, на 720° — снова q.

КолебаниеOscillationДвижение туда-обратно вокруг точки покоя: энергия переливается из растяжения в скорость и обратно. У пружины без трения это синусоида.
КоллайдерColliderНевидимая упрощённая модель предмета для физики: по ней считают касания, удары и лучи. Модель для глаз может быть сложной, коллайдер — грубый.

Если коллайдер больше модели, герой стоит в воздухе; если меньше — проходит сквозь край.

Косинус углаCosineСколько точка на круге радиуса 1 под углом a ушла вправо: cos a. Это же доля стрелки длиной 1, которая идёт вдоль другой: 1 при 0°, 0.5 при 60°, 0 при 90°, −1 при 180°.
Коэффициент затуханияDamping ratioЗатухание как доля от критического: ζ = затухание / 2√(жёсткость × масса). Меньше 1 — пружинит с перелётом, 1 — без перелёта, больше 1 — вязко.

Перелёт после отпускания: при ζ = 0.2 — 53%, 0.5 — 16%, 0.7 — 5%. Подвеска легковой машины — около 0.25.

Кривая плавностиEasingКривая, через которую пропускают равномерно растущее время перед lerp: разгон (ease in), торможение (ease out) или оба (ease in-out). Так дверь и камера трогаются и встают мягко.
Критическое затуханиеCritical dampingЗатухание 2√(жёсткость × масса), ζ = 1: самый быстрый приход к цели без перелёта. Так работают хороший дверной доводчик и SmoothDamp в Unity.
ЛучRaycastВопрос физике: что первым встретится на этой прямой? Ответ — точка попадания, нормаль, расстояние и предмет. Выстрелы, проверка земли под ногами, видимость.
Мантисса и порядокMantissa (significand) and exponentДве части числа с плавающей точкой: мантисса — значащие цифры, порядок — на какую степень двойки их умножить. У float 1 бит знака, 8 бит порядка и 23 бита мантиссы.
МассаMassМера того, как трудно изменить скорость предмета, в килограммах. Тот же толчок разгоняет гружёную тележку слабее пустой: ускорение = сила / масса.

В Unreal масса по умолчанию считается из объёма коллизии и плотности материала: модель вдвое крупнее весит в 8 раз больше. На падение без воздуха масса не влияет.

Матрица преобразованияTransformation matrixТаблица, в которой столбцами записаны новые оси (и в последнем столбце — пивот). Умножить матрицу на точку — пройти рецепт точки по новым осям. Так переводят точки из одного пространства в другое.
Метод ЭйлераEuler integrationСамый простой способ шагать во времени: скорость += ускорение × Δt, позиция += скорость × Δt. Ошибка пропорциональна шагу. Полунеявный вариант сначала меняет скорость, и он устойчив.

Явный Эйлер двигает позицию по скорости начала шага и добавляет энергию: пружина раскачивается всё шире. Полунеявный берёт скорость конца шага и держит размах. Точный шаг при постоянном ускорении — позиция += скорость × Δt + ускорение × Δt² / 2: площадь трапеции под графиком скорости.

МешокShuffle bagСлучайность без возврата: исходы кладут в мешок в нужных долях и тянут, пока мешок не опустеет, потом насыпают заново. Доли точные, длинных серий нет. Так раздаёт фигуры современный «Тетрис».
Момент силыTorqueКрутящее действие силы: плечо × сила поперёк плеча. Дверь толкают у ручки, потому что там плечо длиннее; сила вдоль плеча не крутит.

В 3D момент — вектор вдоль оси вращения, векторное произведение плеча и силы. Роль массы для вращения играет инерция: масса далеко от оси крутится тяжелее.

Непрерывное обнаружение столкновенийContinuous collision detection (CCD)Проверка не «пересекаются ли сейчас», а «заденет ли по дороге»: тело протаскивают броском формы от прошлого положения к новому и находят время удара. Лечит проскок быстрых тел.

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

НормализацияNormalizeРазделить вектор на его длину: направление остаётся, длина становится 1. Нужна, когда важно только «куда», а «сколько» задают отдельно.
Нормаль контактаContact normalНаправление, в котором два касающихся тела проще всего развести. По нему выталкивают, отражают скорость и считают трение.
Обратная матрицаInverse matrixМатрица, которая отменяет данную: M⁻¹ × M = единичная. Шаги отменяются в обратном порядке. Переводит из мира обратно в пространство предмета. Нет у матрицы с нулевым определителем.
Обратный lerpInverse lerpКакая доля пути от A до B пройдена, если ты в x: t = (x − A) / (B − A). 0 — в A, 1 — в B, за пределами — меньше 0 или больше 1. Здоровье 35 из 140 — доля 0.25.
Ограничивающая сфераBounding sphereШар, в который целиком помещается предмет. Касание двух шаров — расстояние между центрами меньше суммы радиусов: самая дешёвая проверка.
ОпределительDeterminantВо сколько раз матрица меняет площади (в 3D — объёмы). Для 2 × 2 — a × d − b × c, площадь клетки на новых осях. Минус — мир отражён и порядок обхода вывернут, ноль — всё схлопнулось и обратной матрицы нет.
ОсадкаDraft (draught)Глубина, на которую плавающий предмет погружается, пока выталкивание не сравняется с весом. У бруска доля под водой равна отношению плотностей.

Вокруг осадки предмет качается, как груз на пружине, с периодом 2π√(осадка / g): осадка 30 см — 1.1 с, 10 м — 6.3 с.

Ось и уголAxis-angleЗапись поворота одной единичной осью и одним углом вокруг неё. По теореме Эйлера так можно записать любой поворот в 3D.
Отбрасывание задних гранейBackface cullingВидеокарта не рисует треугольники, повёрнутые к камере задней стороной: считает на экране знак их площади и выбрасывает те, чей обход не лицевой. У закрытой модели так пропадает около половины граней. Листве и ткани его выключают двусторонним материалом.
ПерекосShear, skewПреобразование, при котором одна ось стоит на месте, а другая наклоняется: стопку книг толкнули вбок. Площадь не меняется. Так качаются на ветру трава и деревья.
ПереполнениеInteger overflowЦелое число вышло за свой предел и перескочило на другой край, как счётчик пробега после 999999: в байте 255 + 1 = 0, в байте со знаком 127 + 1 = −128.

Отрицательные числа хранят дополнительным кодом: вторую половину круга значений читают как отрицательные, ряд 11111111 — это −1. Пределы: 8 бит со знаком — от −128 до 127, 32 бита — около ±2.1 миллиарда, 64 бита — около ±9.2 × 1018.

ПлавучестьBuoyancyСила, которой вода толкает вверх погружённый предмет: плотность воды × g × объём под водой. Растёт с глубиной, пока предмет не уйдёт под воду целиком.

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

ПлотностьDensityСколько весит кубометр вещества: вода 1000 кг, сосна около 500, лёд 917, сталь 7850. Плотнее воды — тонет, легче — плавает.

Для полого предмета считают среднюю плотность: весь вес на весь объём вместе с воздухом внутри. Поэтому стальной корабль плавает, а стальной гвоздь тонет.

ПодшагиSubsteppingШаг физики делят на несколько маленьких: снимков больше, путь за шаг короче, проскоков меньше. Цена — вся физика считается во столько же раз чаще.
Половинная точностьHalf-precision float, FP16Число с плавающей точкой на 16 бит: около трёх значащих цифр, максимум 65 504. В нём хранят HDR-свет кадра, UV мешей и многое в шейдерах, где экономят память.
Порядок обхода вершинWinding orderВ каком порядке перечислены вершины треугольника: с одной стороны обход виден по часовой стрелке, с другой — против. Программа договаривается, какой обход лицевой, и по нему решает, какую сторону грани рисовать и куда смотрит нормаль.

В Blender лицевым считается обход против часовой, в Unity и Godot — по часовой. Отражение, то есть масштаб −1 по одной оси, переворачивает обход.

Правило правой рукиRight-hand ruleКак узнать, куда смотрит a × b: согни пальцы правой руки от a к b, и большой палец покажет направление. Так в правых системах координат, как в Blender и Godot; в левых, как в Unreal и Unity, то же показывает левая рука.
Предельная скоростьTerminal velocityСкорость, на которой сопротивление среды сравнялось с весом и падение перестало разгоняться. У человека животом вниз около 55 м/с, с парашютом около 5 м/с.

При сопротивлении k × v² она равна √(масса × g / k): чем больше масса на единицу площади, тем быстрее падает тело. Капля дождя — не быстрее 9 м/с.

Проекция вектораVector projectionЧасть вектора вдоль заданного направления: (b · a) × a для единичной a. Остаток идёт поперёк. Так делают скольжение вдоль стены и скатывание со склона.
Произведение матрицMatrix multiplicationМатрица, которая делает сначала одно преобразование, потом другое. В записи A × B первым действует B — читают справа налево. Порядок важен: A × B обычно не равно B × A.

Столбцы A × B — столбцы B, пропущенные через A. Отсюда правило «строка на столбец»: каждое число ответа — скалярное произведение строки A на столбец B.

ПружинаSpringСила, которая тянет к цели тем сильнее, чем дальше: −жёсткость × отклонение. С затуханием даёт плавный приход к цели: камера, отдача, подвеска.

Пружина меняет ускорение, а не скорость, поэтому разгоняется и тормозит плавно. Настраивают её частотой и коэффициентом затухания ζ.

Пружинные костиSpring bonesКости, которые тянутся пружиной к позе из анимации и раскачиваются по инерции: косы, хвосты, уши, сумки.
Псевдослучайные числаPseudo-random numbers, PRNGЧисла, похожие на случайные, которые выдаёт формула: из одного числа она делает следующее. С тем же стартовым числом, сидом, ряд всегда повторяется.

Старый рецепт — линейный конгруэнтный генератор: следующее = (a × предыдущее + c) по модулю m. Разных чисел всего m, поэтому у ряда есть период, а у плохих генераторов видны узоры: чередование чётности, полосы. Современные (xorshift, PCG) ещё перемешивают разряды.

РадианRadianУгол, при котором дуга равна радиусу, около 57.3°. Полный оборот — 2π ≈ 6.28 радиана, пол-оборота — π. В радианах дуга = радиус × угол, поэтому формулы и шейдеры считают углы в них.
Разделяющая осьSeparating axisНаправление, на котором тени двух тел не перекрываются. Если оно есть, между телами можно просунуть ровный лист, и они не касаются. Работает только для выпуклых форм.

Для двух прямоугольников проверяют 4 оси поперёк сторон, для двух коробок в 3D — 15. Ось с наименьшим перекрытием даёт нормаль и глубину контакта.

Распределение вероятностейProbability distributionКакие результаты как часто выпадают. Один кубик — равномерное: все грани поровну. Сумма двух — треугольник с вершиной на 7. Сумма многих — колокол, нормальное распределение.
Растущий шанс, PRDPseudo-random distributionШанс срабатывания растёт с каждой неудачей и сбрасывается после удачи. Среднее остаётся заявленным, а длинные серии пропадают. В Dota 2 у 25% первый шанс около 8.5%, к 12-й попытке он доходит до 100%.
Рука камерыSpring armПалка от героя к камере, которая укорачивается, если между ними стена. Её «пружина» — про стены, плавность догона задают отдельной настройкой.

В Unreal плавность — Camera Lag Speed: доля пути за кадр, а не пружина. У SpringArm3D в Godot плавности нет совсем.

Рысканье, тангаж, кренYaw, pitch, rollТри поворота самолёта: рысканье — нос влево-вправо вокруг вертикали, тангаж — нос вверх-вниз вокруг оси крыльев, крен — наклон крыльев вокруг оси от хвоста к носу.
Сдвиг начала мираOrigin shifting, floating originПриём для огромных миров на обычной точности: когда игрок ушёл далеко, весь мир сдвигают так, чтобы игрок снова оказался у начала координат. Точность сохраняется, но логика игры усложняется.
СидSeedСтартовое число генератора псевдослучайных чисел. Один сид — один и тот же ряд чисел и один и тот же построенный из них мир на любом компьютере.
СилаForceТо, что меняет скорость: толчок, тяга, притяжение. Это вектор. Ускорение = сила / масса; несколько сил складывают как стрелки, и решает итог.

Ньютон — сила, которая разгоняет 1 кг на 1 м/с за секунду. Итоговая сила ноль значит «скорость не меняется», а не «стоит». В движке силу дают каждый шаг (Add Force), и он сам умножает её на Δt.

Сила реакции опорыNormal forceСила, с которой поверхность толкает предмет прямо от себя, по нормали. Она ровно такая, чтобы предмет не проваливался, и от неё зависит трение.

На склоне под углом θ опора гасит часть веса поперёк склона, вес × cos θ, а часть вдоль, вес × sin θ, тянет предмет вниз.

Синий шумBlue noiseСлучайный узор без крупных пятен, только с мелким зерном: точки стоят неровно, но не кучками. Глаз зерно почти не замечает, поэтому синий шум берут для дизеринга и для выбора случайных лучей.
Синус углаSineВысота точки на круге радиуса 1 под углом a: sin a, от −1 до 1. Синус от времени — плавная волна, которой качают траву и лодки и мигают светом.

Синус — тот же косинус, только на четверть оборота позже: sin a = cos(a − 90°). Общая формула волны — центр + амплитуда × sin(2π × частота × время + фаза).

СкалярScalarОбычное число, в отличие от вектора: скорость 5 м/с, время кадра, яркость. Умножение вектора на скаляр меняет его длину, а отрицательный скаляр ещё и разворачивает.
Скалярное произведениеDot productОдно число из двух стрелок: сколько одна идёт вдоль другой. a.x × b.x + a.y × b.y + a.z × b.z. Для стрелок длиной 1 — косинус угла: 1 — в одну сторону, 0 — поперёк, −1 — навстречу.
СкоростьVelocity, speedНасколько меняется положение за секунду, в м/с. Это вектор: направление — куда движется предмет, длина — как быстро. Длину показывает спидометр.

Скорость читается по следам, оставленным через равные промежутки времени: промежуток между соседними следами — скорость × время между ними. Каждый кадр игра делает позиция += скорость × Δt.

Случайность по координатамHash-based randomСлучайное число, которое считают из адреса — координат клетки или номера точки — и сида. Один адрес всегда даёт одно число, соседние — совсем разные, очередь и память не нужны. Основа шума и случайности в шейдерах.
Сопротивление средыDragСила, которой воздух или вода мешают двигаться, против скорости. Медленно и вязко — пропорциональна скорости, быстро — её квадрату: k × v².

Число k собирает площадь поперёк движения, форму и плотность среды. Вода примерно в 800 раз плотнее воздуха. Движки обычно заменяют сопротивление затуханием.

Спекулятивные контактыSpeculative contactsКонтакт на будущее: в начале шага находят всё, до чего тело может долететь, и не дают сближаться быстрее, чем зазор / время шага. Дёшево и ловит вращение, но иногда тело ударяется о воздух у углов.
Сравнение с допускомEpsilon comparisonДробные числа сравнивают не на точное равенство, а спрашивают, меньше ли разница допуска. После вычислений 1 превращается в 0.9999999, и проверка «равно» не срабатывает.
Точки замера плавучестиBuoyancy sample points (pontoons)Несколько точек на корпусе (обычно 3–8), в каждой из которых считают глубину под волной и силу вверх: жёсткость × глубина − затухание × разница скоростей с водой.

Точки по краям сами дают крен по волне; одна точка в центре масс — только подъём и спуск. Волна короче двух расстояний между точками проскальзывает между ними.

ТраекторияTrajectoryПуть, по которому движется предмет. У брошенного предмета под одной гравитацией это парабола: позиция(t) = старт + скорость × t + ускорение × t² / 2.
ТранспонированиеTransposeПоменять в матрице строки и столбцы местами, отразить её по диагонали. Для поворота транспонированная — это обратная, потому что оси перпендикулярны и длиной 1.

Обратная транспонированная матрица переводит нормали: она сохраняет перпендикулярность нормали к поверхности при неравномерном масштабе.

ТрениеFrictionСила вдоль поверхности против движения или попытки сдвинуть. Пропорциональна прижатию: μ × N. Трение покоя держит до предела, скольжения обычно меньше.

Площадь касания на трение не влияет. Ящик на склоне стоит, пока tan θ ≤ μ покоя. В движках трение задаёт физический материал, а у пары поверхностей его сводят в одно число, по умолчанию средним.

ТриггерTriggerКоллайдер, который никого не толкает, а только сообщает «вошёл» и «вышел»: зона у двери, контрольная точка, объём воды.

Кто с кем сталкивается, решают каналы (слои): у каждой пары ответы блок, пересечение или игнор, и побеждает более мягкий.

ТуннелированиеTunnelingБыстрое тело проходит сквозь препятствие: физика проверяет касания только на снимках, и ни один снимок не застал тело внутри. Возможно, когда путь за шаг больше толщины стены плюс размера тела.

Шанс застать тело в стене — (толщина + размер) / путь за шаг. Надёжно, только если путь за шаг меньше половины этого окна: снимок за серединой стены выталкивает тело вперёд.

Углы ЭйлераEuler anglesПоворот, записанный тремя углами по очереди вокруг трёх осей, например рысканье, тангаж и крен. Понятны человеку, но зависят от порядка, попадают в шарнирный замок и плохо смешиваются.
Упругость удараRestitutionДоля скорости вдоль нормали, которая возвращается после удара: 0 — не отскакивает, 1 — без потерь. Высота подскока умножается на e².

v' = v − (1 + e) × (v · n) × n. Упругость — свойство пары материалов: движки сводят два числа в одно, по умолчанию средним.

УскорениеAccelerationНасколько меняется скорость за секунду, в м/с². Разгон, торможение и поворот — всё ускорение. Гравитация Земли даёт 9.8 м/с² вниз.

На повороте спидометр стоит на месте, а направление скорости меняется: ускорение смотрит к центру и равно v² / r. Каждый кадр игра делает скорость += ускорение × Δt.

ФазаPhaseСдвиг волны по кругу: с какого места круга начинать качание. Одинаковые волны с разной фазой идут не в ногу, а фаза из положения превращает качание хором в бегущую волну.
Фиксированный шаг физикиFixed timestepФизика считается ровными шагами, например по 1/60 с, отдельно от кадров. Копилка времени решает, сколько шагов сделать в кадре, а отрисовку сглаживают между шагами.

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

Форма столкновенияCollision shapeПростая форма, из которых собирают коллайдер: сфера, коробка, капсула, выпуклая оболочка. Для каждой есть быстрые проверки касания.
Функция ребраEdge functionПлоское векторное произведение ребра треугольника и шага к точке: (B − A) × (P − A). Знак говорит, по какую сторону ребра лежит точка. Если у трёх функций один знак, точка внутри — так растеризатор находит пиксели треугольника.
Центр массCenter of massТочка, где предмет «в среднем» находится и куда как будто приложена гравитация. Сила через него только двигает, мимо него — ещё и крутит.

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

Центр плавучестиCenter of buoyancyЦентр той воды, которую вытеснил корпус, — точка, где приложено выталкивание. При наклоне он смещается к опустившемуся борту.

Лодка выпрямляется, пока центр масс ниже метацентра — точки, через которую при малом наклоне проходит линия выталкивания. Для лодки с прямыми бортами метацентр выше центра плавучести на ширина² / (12 × осадка).

Частота и периодFrequency, periodЧастота — сколько полных колебаний в секунду, в герцах. Период — время одного колебания: 1 / частота. 0.5 Гц — одно качание за 2 секунды.
Число с плавающей точкойFloating-point number, float, doubleНаучная запись в двоичном виде: значащие цифры и степень двойки. У float на 32 бита около 7 значащих цифр, у double на 64 — около 16. Шаг между соседними числами растёт с величиной числа.
Шарнирный замокGimbal lockКогда средний из трёх углов Эйлера равен 90°, оси первого и третьего поворота ложатся на одну прямую: два угла крутят одинаково, и одно движение пропадает. Так камера кувыркается, глядя строго вверх.
Широкая фазаBroad phaseПервый грубый проход проверки столкновений: сеткой или деревом коробок отбрасывает далёкие пары. Оставшиеся точно проверяет узкая фаза.

Без неё пар n × (n − 1) / 2: 1000 предметов — почти полмиллиона пар за шаг.

Экспоненциальное сглаживаниеExponential smoothingКаждый шаг проходить одну и ту же долю оставшегося пути к цели: остаток умножается и тает всё медленнее. Чтобы не зависеть от частоты кадров, долю за кадр берут 1 − exp(−скорость × время кадра).
AABBAxis-aligned bounding boxКоробка, стороны которой идут вдоль осей мира. Две такие коробки касаются, только если их тени перекрываются на каждой оси: шесть сравнений.
atan2, угол стрелкиatan2, two-argument arctangentУгол стрелки (x, y) от оси x с учётом четверти: от −180° до 180°. Сначала y, потом x. В отличие от atan(y / x), не теряет знаки и не делит на ноль.
Clamp, ограничениеClampНе выпускает число за края: clamp(x, мин, макс) возвращает мин, если x меньше, макс, если больше, и само x между ними. clamp до 0…1 называют saturate.
Lerp, смешивание по долеLinear interpolationПройти долю t пути от A к B: A + (B − A) × t, или то же самое A × (1 − t) + B × t. При t = 0 чистое A, при t = 1 чистое B, вне 0…1 — за концами.

t — доля второго входа. Маска даёт t каждому пикселю, поэтому lerp кладёт один материал поверх другого. Та же операция смешивает позы в анимации и громкости при плавном переходе звуков.

NaN и бесконечностьNaN, infinityОсобые значения float. 1 / 0 даёт бесконечность, 0 / 0 и корень из −1 — NaN, «не число». NaN заразен: любое действие с ним даёт NaN, и на экране он расползается чёрными квадратами.
NlerpNormalized lerpLerp четырёх чисел кватерниона и нормализация результата. Путь тот же, что у slerp, скорость чуть неровная на больших углах, зато дешевле. Основа смешивания анимаций.
Poisson diskPoisson disk samplingСлучайная расстановка точек, где никакие две не стоят ближе заданного расстояния. Без кучек и проплешин белого шума, поэтому так расставляют растения и камни.
Remap, перевод диапазонаRemap, map rangeПеревод числа из одной шкалы в другую: обратный lerp находит долю на старой шкале, lerp откладывает её на новой. Синус −1…1 в яркость 0…1 — это 0.5 + 0.5 × sin.
SlerpSpherical linear interpolationПлавный переход между двумя кватернионами по дуге: поворот вокруг одной оси, по короткому пути и с постоянной скоростью. Если скалярное произведение отрицательное, одну позу берут с минусом, чтобы идти коротким путём.
SmoothstepSmoothstepМягкий переход от 0 к 1: 3t² − 2t³. На концах кривая горизонтальная, поэтому края масок и начало движения не дёргаются. В шейдерах smoothstep(край0, край1, x) ещё делает обратный lerp и обрезку.

Формула — lerp от разгона t² к торможению 1 − (1 − t)² с долей t. Ещё мягче smootherstep: 6t⁵ − 15t⁴ + 10t³.

Арт

11 терминов
Атлас текстурTexture atlasОдна текстура, на которой разложено несколько рисунков: веток, листьев, травинок. Все карточки куста берут свой кусок атласа, поэтому у куста один материал.

Атлас листвы запекают с высокополигональных веток или снимают с фото: цвет, маска, нормаль, толщина, AO. Атлас листвы.

Воздушная перспективаAerial perspective, atmospheric perspectiveЧем дальше предмет, тем меньше в нём контраста и деталей, тем бледнее его цвета и тем сильнее они уходят в цвет фона, обычно голубоватый. Причина — дымка воздуха между предметом и глазом.
Жёсткое реброHard edge / split normalsРебро, на котором у вершины две нормали — по одной на каждую сторону, поэтому свет на нём ломается резко. При запекании каждое жёсткое ребро должно быть швом развёртки.
ЗапеканиеBakingПеренос деталей с одной модели на текстуру другой. Так делают карту нормалей: с high poly на low poly.
Золотой часGolden hourВремя вскоре после восхода и перед закатом: свет краснее и мягче, больше света от неба, тени длинные, а небо по яркости сравнивается с фонарями и окнами.
Маска ветраWind mask, vertex color maskЧисло от 0 у корня до 1 на макушке, на которое умножают сдвиг ветра: корень стоит, верх качается. Берут из высоты вершины или рисуют в цвет вершин.

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

Поля вокруг островов, paddingUV padding / dilationЗапас пикселей вокруг каждого острова развёртки, куда бейкер продлевает цвет краёв. Без него при фильтрации и в мип-мапах на швы просачиваются соседи.
РепуссуарRepoussoirПредмет на краю переднего плана — дерево, арка, фигура, — который обрамляет вид, вводит в него взгляд и даёт глубину. С французского — «отодвигать назад».
СилуэтSilhouetteКонтур предмета. Карта нормалей его не меняет, поэтому по силуэту видна настоящая форма. В художественной базе силуэт — первое, по чему читают предмет.
Синий часBlue hourСумерки, когда солнце уже заметно ниже горизонта: прямого солнца и резких теней нет, свет синий. Синеву даёт поглощение света озоном, а не рассеяние Рэлея.
High poly и low polyHigh poly / low polyДетальная модель на миллионы полигонов и простая модель для игры. С детальной на простую запекают карту нормалей.

Окружение

7 терминов
Анимация ветра в шейдереWind animation, procedural windТрава и листва качаются без кадров анимации: вершинный шейдер сдвигает вершины на синус времени с фазой из положения, умноженный на маску. Порывы добавляет шум, который бежит по полю.

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

Карточка листвыFoliage cardПлоскость из двух треугольников с рисунком ветки или травы и маской, которая вырезает всё вокруг листьев. Кусты и пучки травы — две-три карточки крест-накрест, крона — сотни карточек на ветках.

Вырезает форму режим Masked. Цена — пустые пиксели внутри карточки и слои карточек друг за другом. Карточка: фанера с рисунком, цена.

Нормали листвыFoliage normals, spherical normalsНормали карточек куста, направленные от его центра, как у шара. Без них соседние карточки освещены вразнобой и куст рассыпается на плоские лоскуты; с ними он освещён как объём.

Нормали переносят со сферы или купола в редакторе моделей. Все нормали вверх убирают лоскуты, но и объём. Почему куст выглядит плоским.

Подгонка карточки по контуруCard trimming, tight-fit cardsУглы прямоугольной карточки, где нет листьев, отрезают: карточка становится многоугольником по контуру рисунка. Вершин больше, пустых пикселей меньше — на ветке до четверти работы шейдера.

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

ПоймаFloodplainПлоское дно долины вдоль реки, которое река заливает в половодье: в нетронутой реке обычно раз в год-два. Паводок оставляет ил, поэтому земля плодородная — хороша для лугов и полей, плоха для домов.
Просвет листвыTwo Sided Foliage, foliage transmissionМодель затенения для тонких листьев: свет с обратной стороны листа проходит насквозь и окрашивается цветом просвета. Против солнца куст светится, а не чернеет.

Где просвет сильнее, решает карта толщины из атласа: черешок и прожилки темнее. Карточке нужна и отрисовка обеих сторон. Просвет.

Pivot PainterPivot PainterИнструмент Epic, который записывает для каждой части меша — ветки, листа — её точку крепления и направление в текстуры, а номер части — в развёртку. Материал поворачивает каждую часть вокруг её основания.

Есть скрипт для 3ds Max, ассет для Houdini и дополнение для Blender от сообщества. Пример материала поддерживает до четырёх уровней вложенности. Ствол, ветки, листья.

Мир и уровни

59 терминов
Береговая линияShorelineЛиния, где земля стоит ровно на высоте уровня воды, — горизонталь. На экране это место, где земля протыкает плоскость воды.
БиомBiomeУчасток мира со своим набором растений и правилами, где они растут: высота, склон, вода, свет. В играх биом задают набором правил расстановки.
БлокаутBlockout (greybox)Мир или уровень из простых форм без деталей, чтобы проверить расстояния и путь.
ВиниWeenieСловечко Уолта Диснея: крупный ориентир, видный издалека, который тянет к себе посетителей, как сосиска собак. В Диснейленде такой стоит в центре каждой тематической зоны.
Водосбор (бассейн реки)Drainage basinВся земля, с которой дождь стекает к одной точке реки. Граница водосбора — водораздел: линия по гребням, по разные стороны которой вода уходит в разные реки.
ВорлдбилдингWorldbuildingПридумывание мира игры: рельеф и климат, кто где живёт и почему, что здесь было раньше. В играх он служит игре: объясняет изнутри мира то, что нужно игре. По The Level Design Book, история решает задачи игры.
Выемка и насыпьCut and fillКак дорогу делают ровной полкой на склоне: сверху землю срезают (выемка), снизу подсыпают (насыпь). Края — откосы, обычно 1 к 1,5, около 34°.
Граница лесаTreelineВысота, выше которой деревья не растут: слишком холодно. В горах она там, где средняя температура почвы за тёплый сезон около 6,5 °C.
Дальность загрузкиLoading rangeРадиус вокруг игрока, внутри которого ячейки мира загружены. Память растёт как квадрат дальности, а запас времени на загрузку — примерно дальность, делённая на скорость игрока.
Дальность прорисовкиDraw distance, view distanceКак далеко в игре видно мир. Это не одно число: мелочь отсекают в десятках метров, дома вдали заменяют упрощёнными копиями, мир грузится кусками вокруг игрока, а даль гасит туман.

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

Единица мираWorld unit, Unreal Unit (uu)Что значит «1» в координатах движка. В Unreal единица — сантиметр, в Unity, Godot и Blender — метр. При переносе модели единицы пересчитывают: метровый куб в Unreal — 100 единиц.

Ошибка в единицах выдаёт себя моделью в 100 раз меньше или больше и предметами, которые падают как в замедленной съёмке: гравитация в движке настоящая. Подробнее.

Источник подгрузкиStreaming sourceТочка, вокруг которой World Partition грузит ячейки. По умолчанию это игрок; ещё один источник ставят, например, в место телепорта, чтобы загрузить его заранее.
Карта весовWeightmapСерая карта на сетке ландшафта для одного слоя краски: сколько этого слоя в каждой вершине, от 0 до 1. У смешанных слоёв веса в вершине в сумме дают 1: прибавишь камню — убудет у травы.
Карта высотHeightmapСерая картинка, где яркость пикселя — высота точки земли: чёрное ниже, белое выше. Один пиксель — одна вершина ландшафта. Для земли её хранят в 16 битах, иначе на пологих склонах видны ступеньки.
Карта теченияFlow mapТекстура поверх воды, в каждом пикселе которой записано, куда и как быстро течёт вода: канал R — скорость по X, канал G — по Y, 0.5 значит ноль. Материал ведёт по ней рябь.
КаустикаCausticsСветлая бегущая сетка на мелком дне: бугорки ряби работают как маленькие линзы и собирают солнечный свет в яркие линии. Гаснет с глубиной и в мутной воде.
Кольца ТюненаVon Thünen modelМодель Иоганна фон Тюнена (1826): вокруг рынка на ровной земле хозяйство ложится кольцами. Что быстро портится или тяжело везти — ближе, что может подождать или идёт само — дальше. Рельеф, реки и дороги кольца гнут.
Компонент ландшафтаLandscape componentКвадратный кусок ландшафта в Unreal со своей текстурой высот, слоями краски и столкновениями. Делится на 1 или 2 × 2 секции; секция — единица детализации и вызов отрисовки. Epic советует не больше 32 × 32 компонентов.
ЛандшафтLandscape, terrainЗемля в игре: ровная сетка вершин, у каждой одна высота из карты высот. Её дёшево хранить, легко править и упрощать вдали, но нависаний, пещер и отвесных стен она не умеет — их делают мешами поверх.
Линия обзораSightlineКоридор пустого пространства, сквозь который видно другое место. Даёт возможность увидеть, но не заставляет смотреть.
Место поселенияSiteТо, что под поселением: вода, сухая и ровная земля, укрытие, защита, лес и камень для домов, почва. Место решает, появится ли поселение вообще.
Метрики игрокаPlayer metricsРазмеры и умения тела игрока, под которые строят мир: рост и ширина, высота глаз и камеры, какую ступень он перешагнёт, по какому склону пройдёт, как высоко прыгнет и как быстро бежит.

Персонаж шаблона Unreal — капсула 84 × 192 см, ступень до 45 см, склон до 44.8°, бег 5 м/с, камера на 4 м за спиной. Поэтому проходы в играх шире настоящих, а ступени и перила — как в жизни. Подробнее.

Меш вдоль сплайнаSpline meshПрямая модель, которую движок сгибает по кривой: каждую вершину переносят в точку сплайна на той же доле длины. Длинный участок растягивает рисунок, тесный поворот выворачивает внутренний край.
Мотивированный светMotivated lightСвет, у которого в кадре есть правдоподобный источник — окно, лампа, огонь. Невидимые лампы движка ставят так, будто свет идёт от них; один светильник часто держат несколько ламп.
Мысленная картаMental mapКарта места, которую человек держит в голове. По Кевину Линчу, она складывается из путей, границ, районов, узлов и ориентиров. Мир, где работают все пять, запоминается.
Неразрушающая правкаNon-destructive editingПравка, которая хранится отдельно от основы и пересчитывается, когда основа меняется. Её можно выключить или переделать, и ничего под ней не испортится.
Один файл на акторOne File Per Actor (OFPA)Режим Unreal, где каждый предмет уровня хранится в своём файле, а не в одном общем. Так много людей правят одну карту, не мешая друг другу. С World Partition включён по умолчанию.
Окно в пологеCanopy gapДыра в пологе там, где упало дерево или сук. Внизу становится светло, и первыми поднимаются травы, кусты и пионеры.
ОпушкаForest edgeКрай леса, где он встречает луг или поле. Там больше света и ветра, поэтому густо растут кусты и подрост, а граница — полоса, а не линия.
ОриентирLandmark, point of interest (POI)Запоминающаяся форма или место уровня, которое выделяется среди окружения и по которому игрок понимает, где он. Работает, только если нужен для игры: связан с целью или путём.
Открытый видVistaГлубокий обзор следующего места, с которого игрок успевает его оценить и решить, что делать. Путь, с которого вид открывается, называют подходом.
ПионерPioneer speciesБыстрое светолюбивое растение, которое первым занимает открытую землю после пожара, вырубки или бури. В наших лесах это берёза.
Повествование окружениемEnvironmental storytellingРассказ без слов: уровень строят так, чтобы он сообщал о событии в прошлом или намекал на него. Работает на уровне отдельной комнаты: что случилось здесь, с этими людьми?
Подгрузка уровнейLevel streamingЗагрузка и выгрузка уровней во время игры, чтобы не держать всё в памяти. В Unreal подуровень грузит объём (Level Streaming Volume) или команда Load Stream Level; большие миры теперь режет на куски World Partition.
ПодростSaplings, advance regenerationМолодые деревья главных пород под пологом. Они ждут, когда наверху освободится место, а под сомкнутыми кронами редеют и гибнут.
Полог лесаCanopyСомкнутые кроны верхнего яруса — крыша леса. Перехватывает большую часть света, поэтому под плотным пологом низ беднеет.
Положение поселенияSituationКак поселение связано с остальным миром: дороги, реки, переправы, соседи. Положение решает, вырастет ли деревня в город.
Правило треугольниковTriangle ruleПриём Nintendo из Breath of the Wild: гора, холм или постройка треугольником даёт выбор — перелезть или обойти — и прячет то, что за ней. Крупные треугольники служат ориентирами, средние закрывают обзор, мелкие задают темп.
ПрефабPrefab, Level InstanceГруппа предметов, сохранённая как одно целое: дом с мебелью, двор, причал. Копии расставляют по миру, а правка образца меняет все копии.
ПритяжениеGravity (open world design)Приём Nintendo из Breath of the Wild: места разной заметности и важности расставлены в разных направлениях, каждое тянет к себе, и игрок сам уходит в стороны вместо того, чтобы идти по одной цепочке целей.
Расстановка по правилам, PCGProcedural Content Generation, PCGКомпьютер расставляет тысячи предметов — лес, траву, камни — по правилам «где, сколько и какие» и пересчитывает их после каждой правки земли, воды или дорог.
РегионRegion, districtЧасть открытого мира со своим характером: формой земли, растениями, цветом и светом, делами людей. Регион запоминается, когда меняется сразу несколько таких вещей.
СерпантинSwitchback, hairpinЗигзаг дороги по склону: путь удлиняют, чтобы уменьшить уклон. Дорога не короче, чем подъём, делённый на допустимый уклон. Крутой разворот зигзага — шпилька.
Слои данныхData LayersГруппы акторов в World Partition, которые загружают и выгружают по команде из Blueprint. Так в одном месте держат разные его состояния для квестов, прогресса и событий.
Слои правокEdit layersСтопка правок высоты и краски ландшафта поверх основы. Слой можно спрятать, ослабить, переставить или удалить, не трогая остальное. Дороги и вода правят землю своими слоями и пересчитывают их сами.
СплайнSplineПлавная линия через несколько опорных точек. Вдоль неё строят дорогу, реку или забор, а двигают её, перетаскивая точки.
Сухая точкаDry point siteМесто для поселения чуть выше округи, которое реже заливает: бугор в пойме, край долины. Вода рядом, а паводок не достаёт.
Тело водыWater bodyВода в игре как один объект с формой и уровнем: поверхность с материалом, невидимый объём для плавания и правка земли под ложе. Двигаешь тело — едет всё сразу.
Угол естественного откосаAngle of reposeСамый крутой угол, под которым держится куча сыпучего материала: сухой песок около 34°, влажный около 45°, каменная осыпь 30–40°. Круче материал сползает.
Узел путейRoute centre, nodal pointМесто, где встречаются пути: две долины, две дороги, две реки, переправа через большую реку, проход между холмами. Здесь вырастают города.
Уклон дорогиRoad gradeПодъём, делённый на пройденное расстояние по горизонтали, в процентах: 6 % — шесть метров вверх на сто вперёд. 100 % — это склон 45°, а не стена.
Уклон склонаSlopeНасколько круто поднимается земля: угол склона в градусах. В расстановке его берут из нормали к земле: её вертикальная часть — косинус угла, 1 на ровном месте, 0,87 при 30°, 0,5 при 60°.
Уровень-инстансLevel InstanceНабор предметов, сохранённый как уровень-образец и расставленный по миру копиями. Правишь образец — меняются все копии. Для неподвижных зданий есть упакованный вариант, Packed Level Blueprint.
Цифровая модель высот, DEMDigital elevation model, DEMФайл настоящих высот земли, снятых сверху, например со спутника: сетка точек, у каждой высота в метрах. Бывает модель голой земли и модель поверхности — с верхушками леса и крышами. Глобальные данные идут с шагом около 30 м.
Экспозиция склонаSlope aspectСторона света, куда смотрит склон. В северном полушарии южный склон теплее и суше, северный — тенистый, снежнее, и лес на нём гуще.
ЭрозияErosionРазрушение и перенос земли водой, льдом, ветром и собственным весом. Срезанное наверху ложится ниже наносами. В генераторах рельефа — гидравлическая (вода) и термальная (осыпание до угла откоса).
Ярус лесаForest layer, stratumЭтаж растительности: деревья первой величины, второй, подлесок из кустарников, травы и кустарнички, мхи. Нижние этажи живут светом, который пропустили верхние.
Ячейка подгрузкиStreaming cell, grid cellКвадрат мира, который грузится и выгружается целиком. В Unreal их режет World Partition: в примере Epic ячейка 256 м.
World PartitionWorld PartitionПодгрузка мира кусками в Unreal: мир лежит на сетке ячеек, и в память грузятся только ячейки вокруг игрока.