Ru/Decals

From Valve Developer Community
< Ru
Revision as of 07:54, 18 July 2018 by Romgerman (talk | contribs) (almost there)
Jump to navigation Jump to search

Template:Otherlang2 Template:Finishtranslation:ru

Декаль, размещенная дизайнером уровней.
Следы от пуль сгенерированные игрой автоматически.

Когда игрок стреляет из своего оружия в стену, на ней остается след, который называется декаль (decal). Легче всего представить это как невидимый объект, прикрепленный к поверхности. Плакаты, дырки от пуль, буквы на стенах могут быть созданы с помощью декалей. Декали "прилепают" к объектам, на которые они помещены. К примеру декаль на лестнице каскадом спроецируется вниз, а не будет висеть в воздухе. Вы можете так же использовать декали для нанесения трафаретных букв на стены, чтобы помечать какие-либо места на вашей карте.

Template:Note:ru

Создать декаль не сложно: это обычный материал, у которого есть альфа-канал и который использует 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 дюймов в игре.
Template:Tip:ru
$translucent <bool>
См. $translucent.
$modelmaterial <material>
Материал VertexLitGeneric, который будет применяться к моделям.
$decalfadeduration <float>
Время исчезновения декали. Требует $vertexcolor.
$decalfadetime <float>
Задержка перед исчезновением декали.
$decalsecondpass
Если выключено, то всегда рендерить эту декаль поверх остальных. Если две декали с этим параметром установленным в true пересекаются, то они ведут себя также, как декали без этого параметра.
$fogscale <float>
Template:Note:ru

Декали не поддерживают $bumpmap и $envmap.

Декали на моделях

Template:Note:ru

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), и затеняет целевые пиксели для каждого исходного пикселя, который имеет цвет темнее серого. Этот эффект может быть использован для придания ощущения глубины, при применении к поверхности.

Для начала создайте исходное изображение, цветовой канал которого будет использован для модуляции исходных значений. Еще раз: светлые значения будут осветлять пиксели, поверх которых они нарисованы, в то время как темные значения будут затемнять целевые пиксели. Значения с серым цветом будут рассматриваться как полупрозрачные.

Далее, создайте альфа-канал, который будет определять маску для декали. Так как модуляция не может иметь точное среднее значение корректно, маска обязательна для предотвращение появления границы (обводки) вокруг декали.

Template:Tip:ru

Нужно сделать: Try converting source images with background colors RGB 127 127 127 with vtex found in other games other than L4D2 and see if it results in a background with RGB 124 126 124. Also, does RGB 124 126 124 apply to other versions of the Source engine as alpha for DXT1 compression?
Исходные цвета Исходный альфа-канал Декаль в игре

Наконец, вы должны создать материал, который использует DecalModulate шейдер. Ни $translucent, ни $decal в этот раз не понадобятся.

См. также