Наклейки
![Info content.png](/w/images/f/f6/Info_content.png)
You can help by finishing the translation.
Also, please make sure the article tries to comply with the alternate languages guide.Когда игрок стреляет из своего оружия в стену, на ней остается след, который называется наклейка (decal). Легче всего представить это как невидимый объект, прикрепленный к поверхности. Плакаты, дырки от пуль, буквы на стенах могут быть созданы с помощью наклеек. Наклейки "прилипают" к объектам, на которые они помещены. К примеру налейка на лестнице каскадом спроецируется вниз, а не будет висеть в воздухе. Вы можете так же использовать наклейки для нанесения трафаретных букв на стены, чтобы помечать какие-либо места на вашей карте.
![Note.png](/w/images/thumb/c/cc/Note.png/10px-Note.png)
Создать наклейку не сложно: это обычный материал, у которого есть альфа-канал и который использует DecalModulate
шейдер.
До того как читать дальше эту статью, рекомендуем вам ознакомится со статьей про создание материалов .
Contents
Обычные наклейки
Самый популярный тип наклеек - это наклейки, которые выглядят как нанесенное через трафарет изображение. Ниже Вы можете видеть исходное изображение, его альфа-канал и финальный вид в игре:
Параметры материала
Настройки материала для наклейки выглядят примерно так:
LightmappedGeneric { $basetexture decals\mydecal $decal 1 $decalscale 0.1 $translucent 1 $modelmaterial decals\mydecal_model }
$decal <bool >
- Помечает материал как наклейку. Без этой метки найклейку нельзя будет прикрепить к объекту и спроецировать на него.
$decalscale <float >
- Параметр, который отвечает за разрешение наклейки. По умолчанию 1 пиксель изображения принимается за один дюйм в игре. Если исходная текстура наклейки 128 пикселей по ширине, то её ширина в игре при настройке
$decalscale 0.1
будет 12.8 дюймов в игре. Совет:Наклейка не может быть отображена с бо́льшим разрешением, чем поверхность к которой она прикреплена. Оверлеи могут, но они сильнее нагружают процессор.
$translucent <bool>
- См.
$translucent
. $modelmaterial <material>
- Материал
VertexLitGeneric
, который будет применяться к моделям. $decalfadeduration <float>
- Время исчезновения наклейки. Требует
$vertexcolor
. $decalfadetime <float>
- Задержка перед исчезновением наклейки.
$decalsecondpass
- Если выключено, то всегда рендерить эту наклейку поверх остальных. Если две наклейки с этим параметром установленным в
true
пересекаются, то они ведут себя также, как наклейки без этого параметра. $fogscale <float>
Примечание:Найдено в L4D2
decals/checkpoint01_black.vmt
(использует DecalModulate шейдер)
Наклейки не поддерживают $bumpmap и $envmap .
Наклейки на моделях
![Note.png](/w/images/thumb/c/cc/Note.png/10px-Note.png)
VertexLitGeneric
или DecalModulate
шейдер. LightmappedGeneric
будет работать только с элементами мира .Hammer
- Наклейки могут быть помещены на браши в Hammer с помощью инструментов оверлеев или декалей . Эти наклейки будут отображаться сразу после загрузки карты.
- Объект info_projecteddecal может быть использован для проецирования наклейки на любые браши или модели.
C++
Наклейки могут быть созданы на клиенте с помощью функции C_BaseEntity::AddDecal()
. Изнутри она вызывает AddStudioDecal()
или AddBrushModelDecal()
в зависимости от того, является ли энтити брашем или моделью. Параметры для этих функций:
void C_BaseEntity::AddDecal( const Vector& rayStart, const Vector& rayEnd, const Vector& decalCenter,
int hitbox, int decalIndex, bool doTrace, trace_t& tr, int maxLODToDecal );
void C_BaseEntity::AddBrushModelDecal( const Ray_t& ray, const Vector& decalCenter,
int decalIndex, bool doTrace, trace_t& tr );
void C_BaseEntity::AddStudioDecal( const Ray_t& ray, int hitbox, int decalIndex,
bool doTrace, trace_t& tr, int maxLODToDecal );
Это может быть достигнуто и на сервере с помощью функции engine->StaticDecal
:
void IVEngineServer::StaticDecal( const Vector &originInEntitySpace, int decalIndex, int entityIndex, int modelIndex, bool lowpriority );
Индексы наклеек могут быть получены вызовом decalsystem->GetDecalIndexForName
или UTIL_PrecacheDecal()
:
int IDecalEmitterSystem::GetDecalIndexForName( char const *decalname ); // Действующие имена наклеек определены в scripts/decals_subrect.txt
int UTIL_PrecacheDecal( const char *filename, bool preload );
Использование модуляции
Для наклеек, предназначенных для имитации выбоин или вмятин на поверхности, шейдер DecalModulate
(mod2x) оказывается крайне подходящим: он осветляет целевые пиксели для каждого исходного пикселя, который имеет цвет светлее серого (>128), и затеняет целевые пиксели для каждого исходного пикселя, который имеет цвет темнее серого. Этот эффект может быть использован для придания ощущения глубины, при применении к поверхности.
Для начала создайте исходное изображение, цветовой канал которого будет использован для модуляции исходных значений. Еще раз: светлые значения будут осветлять пиксели, поверх которых они нарисованы, в то время как темные значения будут затемнять целевые пиксели. Значения с серым цветом будут рассматриваться как полупрозрачные.
Далее, создайте альфа-канал, который будет определять маску для наклейки. Так как модуляция не может иметь точное среднее значение корректно, маска обязательна для предотвращение появления границы (обводки) вокруг наклейки.
![Tip.png](/w/images/thumb/4/45/Tip.png/9px-Tip.png)
![Left 4 Dead 2](/w/images/thumb/8/8b/Icon-L4D2.png/16px-Icon-L4D2.png)
Наконец, вы должны создать материал, который использует DecalModulate
шейдер. Ни $translucent
, ни $decal
в этот раз не понадобятся.