Маска рельефа (Bump map)

Текстуры, часто называемые картами рельефа (Bump Maps) или картами нормалей (Normal Maps), используются для имитации трёхмерной объёмности на двухмерной поверхности путем изменения её освещённости.

- Статичные реквизит-объекты, использующие маски рельефа, не могут использовать вершинное освещение, за исключением
. $lightmap также несовместим с $bumpmap.
- Карты рельефа нельзя использовать в обычных наклейках и накладки , за исключением
. Они будут правильно отображаться, только если поверхность, на которую они помещены, также имеет маску рельефа. Рельефные "наклейки" можно создавать в любой ветке игровой платформы, независимо от подлежащей геометрии, используя вместо этого элементы карты или деформированную поверхность с материалом $decal.
Формат
Каждый пиксель маски рельефа представляет собой координаты (x, y, z), которые определяют орт-вектор.
Поэтому каждый цветовой канал в маске рельефа имеет свое значение:
- Красный
- Горизонтальная составляющая (ось X)
- 0 = влево
- 128 = фас, или лицом к наблюдателю
- 255 = вправо
- Зелёный
- Вертикальная составляющая (ось Y)
- 0 = вверх
- 128 = фас, или лицом к наблюдателю
- 255 = вниз
- Синий
- Высота (ось Z).
- 0 = обращено 'за' текстуру, от наблюдателя. Это 'плохое' значение. Всё, что меньше 128, означает, что лицевая сторона должна быть обращена от игрока, что невозможно.
- 128 = максимальная глубина, на которую сможет проникнуть динамичное освещение. Меньшие значения использовать не рекомендуется.
- 255 = обращено 'наружу' текстуры, лицом к наблюдателю.

dev/flat_normal
- это плоская маска рельефа, доступная в каждой игре.Три канала представляют собой вектор нормали для каждого пикселя, который определяет направление, в котором пиксель обращён в трёхмерном пространстве. Это позволяет игровой платформе воссоздавать тени и блики на двумерной поверхности или придавать трёхмерной модели большую детализацию.
Маска рельефа практически бесполезна для действительно плоских поверхностей, таких как шлифованный бетон или полированный металл, но даже плоский бетон иногда имеет достаточно объёмные дефекты, чтобы стоило её использовать, особенно в сочетании с картой окружения.
Создание
A bump map should be rendered in Tangent space and use vector directions X+ Y- Z+.

Программы
Различные программы позволяют автоматизировать создание масок рельефа, либо путем анализа изображений, либо с использованием трехмерной геометрии, предоставленной пользователем.
- Двумерные
- Photoshop or Paint Shop Pro
- Substance Designer
- The GIMP
- nDo
- Filter Forge
XBLAH's Modding Tool
- nJob
- Трёхмерные
- XSI
- ZBrush
- Lightwave
- 3ds Max
- Maya
- Blender
- Materialize
- NVIDIA Melody
- Cinema 4D
- NormalMapper
- xNormal
- Другие
- NormalMap Online: A website for generating normal maps online.
- SSBump Generator 5.3: Despite the name, it can also be used to generate bumpmaps, not just self-shadowing bump maps.
- Substance B2M3: Previously known as BitMap2Material.
- InsaneBump: Specifically made to be a free alternative to the now-superseded software "CrazyBump" (may trip antiviruses due to incompatibility)
Преобразование
С помощью VTFEdit
When converting your texture:
- Choose your image format. Uncompressed formats like BGR888 are higher-quality than compressed formats like DXT1, but be wary of file size.
- Check the "Normal map" box in the texture's flags list after the import is complete. It's about 1/5 of the way down the list.

С помощью Vtex
- Save your normal map as a TGA. Give it a name that ends in _normal. The _normal at the end of the name will affect how Vtex converts it. For the brick wall example, we would name the file
brickwall_normal.tga
. - Add
nocompress 1
andnormal 1
to <texture filename>.txt in the same folder as your texture, then compile.
Реализация
Маску рельфа можно создать из основой текстуры с помощью оператора Собеля, который смешивает яркость HSB каждого пикселя с одним из смежных пикселей для определения величины результирующих значений оттенка и насыщенности, которые впоследствии преобразуются в RGB для операции SetPixel.
Bitmap image = (Bitmap) Bitmap.FromFile(@"yourpath/yourimage.jpg");
int w = image.Width - 1;
int h = image.Height - 1;
float sample_l;
float sample_r;
float sample_u;
float sample_d;
float x_vector;
float y_vector;
Bitmap normal = new Bitmap(image.Width, image.Height);
for (int y = 0; y < w + 1; y++)
{
for (int x = 0; x < h + 1; x++)
{
if (x > 0) { sample_l = image.GetPixel(x - 1, y).GetBrightness(); }
else { sample_l = image.GetPixel(x, y).GetBrightness(); }
if (x < w) { sample_r = image.GetPixel(x + 1, y).GetBrightness(); }
else { sample_r = image.GetPixel(x, y).GetBrightness(); }
if (y > 1) { sample_u = image.GetPixel(x, y - 1).GetBrightness(); }
else { sample_u = image.GetPixel(x, y).GetBrightness(); }
if (y < h) { sample_d = image.GetPixel(x, y + 1).GetBrightness(); }
else { sample_d = image.GetPixel(x, y).GetBrightness(); }
x_vector = (((sample_l - sample_r) + 1) * .5f) * 255;
y_vector = (((sample_u - sample_d) + 1) * .5f) * 255;
Color col = Color.FromArgb(255, (int)x_vector, (int)y_vector, 255);
normal.SetPixel(x, y, col);
}
}
Смотреть также
- $bumpmap .
- $ssbump : создание и использование новых самозатеняющихся масок рельефа Valve.
- Создание материала