Наклейки
You can help by finishing the translation.
Also, please make sure the article tries to comply with the alternate languages guide.Когда игрок стреляет из своего оружия в стену, на ней остается след, который называется наклейка (decal). Легче всего представить это как невидимый объект, прикрепленный к поверхности. Плакаты, дырки от пуль, буквы на стенах могут быть созданы с помощью наклеек. Наклейки "прилипают" к объектам, на которые они помещены. К примеру налейка на лестнице каскадом спроецируется вниз, а не будет висеть в воздухе. Вы можете так же использовать наклейки для нанесения трафаретных букв на стены, чтобы помечать какие-либо места на вашей карте.
Создать наклейку не сложно: это обычный материал, у которого есть альфа-канал и который использует DecalModulate
шейдер.
До того как читать дальше эту статью, рекомендуем вам ознакомится со статьей про создание материалов .
Обычные наклейки
Самый популярный тип наклеек - это наклейки, которые выглядят как нанесенное через трафарет изображение. Ниже Вы можете видеть исходное изображение, его альфа-канал и финальный вид в игре:
Параметры материала
Настройки материала для наклейки выглядят примерно так:
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 .
Наклейки на моделях
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), и затеняет целевые пиксели для каждого исходного пикселя, который имеет цвет темнее серого. Этот эффект может быть использован для придания ощущения глубины, при применении к поверхности.
Для начала создайте исходное изображение, цветовой канал которого будет использован для модуляции исходных значений. Еще раз: светлые значения будут осветлять пиксели, поверх которых они нарисованы, в то время как темные значения будут затемнять целевые пиксели. Значения с серым цветом будут рассматриваться как полупрозрачные.
Далее, создайте альфа-канал, который будет определять маску для наклейки. Так как модуляция не может иметь точное среднее значение корректно, маска обязательна для предотвращение появления границы (обводки) вокруг наклейки.
Наконец, вы должны создать материал, который использует DecalModulate
шейдер. Ни $translucent
, ни $decal
в этот раз не понадобятся.