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

From Valve Developer Community
< Ru
Jump to navigation Jump to search
English (en)Español (es)Français (fr)Português do Brasil (pt-br)Русский (ru)中文 (zh)Translate (Translate)
Исходное альбедо-изображение материала (слева) в сравнении с его маской рельефа.
Отображение указанного выше материала в игре.

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

Note.pngПримечание:
  • Статичные реквизит-объекты, использующие маски рельефа, не могут использовать вершинное освещение, за исключением CS:GO engine branch. $lightmap также несовместим с $bumpmap.
  • Карты рельефа нельзя использовать в обычных наклейках(en) и накладки(en), за исключением CS:GO engine branch. Они будут правильно отображаться, только если поверхность, на которую они помещены, также имеет маску рельефа. Рельефные "наклейки" можно создавать в любой ветке игровой платформы, независимо от подлежащей геометрии, используя вместо этого элементы карты или деформированную поверхность с материалом $decal.

Формат

Каждый пиксель маски рельефа представляет собой координаты (x, y, z), которые определяют орт-вектор.

Поэтому каждый цветовой канал в маске рельефа имеет свое значение:

Красный
Горизонтальная составляющая (ось X)
  • 0 = влево
  • 128 = фас, или лицом к наблюдателю
  • 255 = вправо
Зелёный
Вертикальная составляющая (ось Y)
  • 0 = вверх
  • 128 = фас, или лицом к наблюдателю
  • 255 = вниз
Синий
Высота (ось Z).
  • 0 = обращено 'за' текстуру, от наблюдателя. Это 'плохое' значение. Всё, что меньше 128, означает, что лицевая сторона должна быть обращена от игрока, что невозможно.
  • 128 = максимальная глубина, на которую сможет проникнуть динамичное освещение. Меньшие значения использовать не рекомендуется.
  • 255 = обращено 'наружу' текстуры, лицом к наблюдателю.


Note.pngПримечание:Плоская маска рельефа соответственно будет [128, 128, 255]. dev/flat_normal - это плоская маска рельефа, доступная в каждой игре.

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

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

Normalmap.gif

Создание

A bump map should be rendered in Tangent space and use vector directions X+ Y- Z+.

Note.pngПримечание:There are basically two sets of rules for normal maps: DirectX and OpenGL. Their interpretation of green channels are opposite. Source takes the former, whereas Source 2 (even with DX11) takes the latter. Thus, the green channel may need to be inverted depending on the software used to create it.

Программы

Маски рельефа, созданные в различных программах.

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

Двумерные
Photoshop or Paint Shop Pro
Substance Designer
The GIMP
nDo
Filter Forge
XBLAH's Modding Tool 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:

  1. Choose your image format. Uncompressed formats like BGR888 are higher-quality than compressed formats like DXT1, but be wary of file size.
  2. 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.
Tip.pngСовет:VTFEdit can automatically generate bump maps. See the bottom-right of the import screen.

С помощью Vtex

  1. 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.
  2. Add nocompress 1 and normal 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);
		}
	}


Смотреть также

Внешние ссылки