Ru/Decals: Difference between revisions
m (finishtranslation template) |
(almost there) |
||
Line 4: | Line 4: | ||
}} | }} | ||
{{finishtranslation:ru}} | {{finishtranslation:ru}} | ||
[[File:Decal06.jpg|thumb|Декаль, размещенная дизайнером уровней.]] [[File:Decal03.jpg|thumb|Следы от пуль сгенерированные игрой автоматически.]] | [[File:Decal06.jpg|thumb|Декаль, размещенная дизайнером уровней.]] [[File:Decal03.jpg|thumb|Следы от пуль сгенерированные игрой автоматически.]] | ||
Line 10: | Line 9: | ||
Когда игрок стреляет из своего оружия в стену, на ней остается след, который называется декаль (decal). Легче всего представить это как невидимый объект, прикрепленный к поверхности. Плакаты, дырки от пуль, буквы на стенах могут быть созданы с помощью декалей. Декали "прилепают" к объектам, на которые они помещены. К примеру декаль на лестнице каскадом спроецируется вниз, а не будет висеть в воздухе. Вы можете так же использовать декали для нанесения трафаретных букв на стены, чтобы помечать какие-либо места на вашей карте. | Когда игрок стреляет из своего оружия в стену, на ней остается след, который называется декаль (decal). Легче всего представить это как невидимый объект, прикрепленный к поверхности. Плакаты, дырки от пуль, буквы на стенах могут быть созданы с помощью декалей. Декали "прилепают" к объектам, на которые они помещены. К примеру декаль на лестнице каскадом спроецируется вниз, а не будет висеть в воздухе. Вы можете так же использовать декали для нанесения трафаретных букв на стены, чтобы помечать какие-либо места на вашей карте. | ||
{{note:ru|Каждая декаль влияет только на одну энтити ([[The_world|Мир]] это тоже одна большая энтити)}} | {{note:ru|Каждая декаль влияет (проецируется) только на одну энтити ([[The_world|Мир]] это тоже одна большая энтити)}} | ||
Создать декаль не сложно: это обычный материал, у которого есть ''альфа-канал'' и который использует <code>[[DecalModulate]]</code>. | Создать декаль не сложно: это обычный материал, у которого есть ''альфа-канал'' и который использует <code>[[DecalModulate]]</code> шейдер. | ||
До того как читать дальше эту статью, рекомендуем вам ознакомится со статьей про [[Creating_a_Material:ru|создание материалов]]. | До того как читать дальше эту статью, рекомендуем вам ознакомится со статьей про [[Creating_a_Material:ru|создание материалов]]. | ||
== Обычные декали == | == Обычные декали == | ||
Самый популярный тип декалей - это декали, которые выглядят как нанесенное через трафарет изображение. Ниже вы можете | |||
Самый популярный тип декалей - это декали, которые выглядят как нанесенное через трафарет изображение. Ниже вы можете видеть исходное изображение, его альфа-канал и финальный вид в игре: | |||
<div style="text-align:center;">[[Image:decal04.jpg|128px|Исходные цвета]] [[Image:decal05.jpg|128px|Исходный альфа-канал]] [[Image:Decal06.jpg|128px|Декаль в игре]]</div> | <div style="text-align:center;">[[Image:decal04.jpg|128px|Исходные цвета]] [[Image:decal05.jpg|128px|Исходный альфа-канал]] [[Image:Decal06.jpg|128px|Декаль в игре]]</div> | ||
===Параметры материала=== | ===Параметры материала=== | ||
Настройки [[Material:ru|материала]] для декали | |||
Настройки [[Material:ru|материала]] для декали выглядят примерно так: | |||
[[LightmappedGeneric]] | [[LightmappedGeneric]] | ||
Line 38: | Line 39: | ||
; <code>$decalscale <[[float]]></code> | ; <code>$decalscale <[[float]]></code> | ||
: Параметр, который отвечает за разрешение декали. По умолчанию 1 пиксель изображения принимается за один дюйм в игре. Если исходная текстура декали 128 пикселей по ширине, то ее ширина в игре при настройке <code>$decalscale 0.1</code> будет 12.8 дюймов в игре. | : Параметр, который отвечает за разрешение декали. По умолчанию 1 пиксель изображения принимается за один дюйм в игре. Если исходная текстура декали 128 пикселей по ширине, то ее ширина в игре при настройке <code>$decalscale 0.1</code> будет 12.8 дюймов в игре. | ||
:{{tip:ru|Декаль не может быть отображена с | :{{tip:ru|Декаль не может быть отображена с бо́льшим разрешением, чем поверхность к которой она прикреплена. [[Hammer_Overlay_Tool|Оверлеи]] могут, но они сильнее нагружают процессор.}} | ||
; <code>$translucent <bool></code> | ; <code>$translucent <bool></code> | ||
: См. <code>[[$translucent]]</code>. | : См. <code>[[$translucent]]</code>. | ||
; <code>$modelmaterial <material></code> | ; <code>$modelmaterial <material></code> | ||
: Материал <code>[[VertexLitGeneric]]</code>, который будет применяться к моделям | : Материал <code>[[VertexLitGeneric]]</code>, который будет применяться к моделям. | ||
; <code>$decalfadeduration <float></code> | ; <code>$decalfadeduration <float></code> | ||
: Время исчезновения декали. Требует <code>[[$vertexcolor]]</code>. | : Время исчезновения декали. Требует <code>[[$vertexcolor]]</code>. | ||
; <code>$decalfadetime <float></code> | ; <code>$decalfadetime <float></code> | ||
: Задержка перед исчезновением декали | : Задержка перед исчезновением декали. | ||
; <code>$decalsecondpass</code> | ; <code>$decalsecondpass</code> | ||
: Если выключено, то всегда рендерить эту декаль поверх остальных. Если две декали с этим параметром установленным в <code>true</code> пересекаются, то они ведут себя также, как декали без этого параметра. | : Если выключено, то всегда рендерить эту декаль поверх остальных. Если две декали с этим параметром установленным в <code>true</code> пересекаются, то они ведут себя также, как декали без этого параметра. | ||
Line 56: | Line 57: | ||
== Декали на моделях == | == Декали на моделях == | ||
{{note:ru|Декали, которые должны проецироваться на [[Model:ru|модели]] (например кровь) должны использовать <code>[[VertexLitGeneric]]</code> или <code>[[DecalModulate]]</code>. <code>[[LightmappedGeneric]]</code> будет работать только с [[brush:ru|брашами]].}} | {{note:ru|Декали, которые должны проецироваться на [[Model:ru|модели]] (например кровь) должны использовать <code>[[VertexLitGeneric]]</code> или <code>[[DecalModulate]]</code> шейдер. <code>[[LightmappedGeneric]]</code> будет работать только с [[brush:ru|брашами]].}} | ||
=== Hammer === | === Hammer === | ||
*Декали могут быть помещены на [[brush:ru|браши]] в Hammer с помощью инструментов '''[[Hammer Overlay Tool|оверлеев]]''' или '''[[Hammer Decal Tool:ru|декалей]]'''. Эти декали будут отображаться сразу после загрузки карты. | * Декали могут быть помещены на [[brush:ru|браши]] в Hammer с помощью инструментов '''[[Hammer Overlay Tool|оверлеев]]''' или '''[[Hammer Decal Tool:ru|декалей]]'''. Эти декали будут отображаться сразу после загрузки карты. | ||
*Объект [[info_projecteddecal|info_projecteddecal]] может быть использован для проецирования декали на любые браши или модели. | * Объект [[info_projecteddecal|info_projecteddecal]] может быть использован для проецирования декали на любые браши или модели. | ||
== C++ == | == C++ == | ||
Line 86: | Line 87: | ||
== Использование модуляции == | == Использование модуляции == | ||
Для декалей, предназначенных для имитации выбоин или вмятин на поверхности, шейдер <code>[[DecalModulate]]</code> (mod2x) оказывается крайне подходящим: он осветляет целевые пиксели для каждого исходного пикселя, который имеет цвет светлее серого (>128), и затеняет целевые пиксели для каждого исходного пикселя, который имеет цвет темнее серого. Этот эффект может быть использован для придания ощущения глубины, при применении к поверхности. | |||
Для начала создайте исходное изображение, цветовой канал которого будет использован для модуляции исходных значений. Еще раз: светлые значения будут осветлять пиксели, поверх которых они нарисованы, в то время как темные значения будут затемнять целевые пиксели. Значения с серым цветом будут рассматриваться как полупрозрачные. | |||
Далее, создайте альфа-канал, который будет определять маску для декали. Так как модуляция не может иметь точное среднее значение корректно, маска обязательна для предотвращение появления границы (обводки) вокруг декали. | |||
{{Tip:ru|You can avoid "bordering" without creating an alpha channel simply by using BGR888 format instead of DXT1 when you create your VTF. {{l4d2}} It has also been observed in [[Left 4 Dead 2]] that DXT1 compressed textures using DecalModulate shader (such as blood splatters and "graffiti wall writing") with background colors RGB 124 126 124 are considered alpha, alleviating "bordering". L4D2's [[vtex]] will output that specific color from the source image pixels are gray RGB 127 127 127. This solution may also apply to other engines (and other versions of vtex) that use RGB 124 126 124 as the color indicating alpha in-game, but needs further testing.}} | {{Tip:ru|You can avoid "bordering" without creating an alpha channel simply by using BGR888 format instead of DXT1 when you create your VTF. {{l4d2}} It has also been observed in [[Left 4 Dead 2]] that DXT1 compressed textures using DecalModulate shader (such as blood splatters and "graffiti wall writing") with background colors RGB 124 126 124 are considered alpha, alleviating "bordering". L4D2's [[vtex]] will output that specific color from the source image pixels are gray RGB 127 127 127. This solution may also apply to other engines (and other versions of vtex) that use RGB 124 126 124 as the color indicating alpha in-game, but needs further testing.}} | ||
Line 97: | Line 99: | ||
<div style="text-align:center;">[[Image:decal01.jpg|128px|Исходные цвета]] [[Image:decal02.jpg|128px|Исходный альфа-канал]] [[Image:decal03.jpg|128px|Декаль в игре]]</div> | <div style="text-align:center;">[[Image:decal01.jpg|128px|Исходные цвета]] [[Image:decal02.jpg|128px|Исходный альфа-канал]] [[Image:decal03.jpg|128px|Декаль в игре]]</div> | ||
Наконец, вы должны создать материал, который использует <code>[[DecalModulate]]</code> шейдер. Ни <code>$translucent</code>, ни <code>$decal</code> в этот раз не понадобятся. | |||
== См. также == | == См. также == |
Revision as of 07:54, 18 July 2018
Template:Otherlang2 Template:Finishtranslation:ru
Когда игрок стреляет из своего оружия в стену, на ней остается след, который называется декаль (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 дюймов в игре. - Template:Tip:ru
$translucent <bool>
- См.
$translucent
. $modelmaterial <material>
- Материал
VertexLitGeneric
, который будет применяться к моделям. $decalfadeduration <float>
- Время исчезновения декали. Требует
$vertexcolor
. $decalfadetime <float>
- Задержка перед исчезновением декали.
$decalsecondpass
- Если выключено, то всегда рендерить эту декаль поверх остальных. Если две декали с этим параметром установленным в
true
пересекаются, то они ведут себя также, как декали без этого параметра. $fogscale <float>
- Template:Note:ru
Декали не поддерживают $bumpmap и $envmap.
Декали на моделях
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
в этот раз не понадобятся.