Ru/Decals: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
(Fixes and more translation)
m (Worldspawn exists)
 
(18 intermediate revisions by 8 users not shown)
Line 1: Line 1:
{{otherlang2
{{LanguageBar|title = Наклейки}}
|title=Декали
{{tabs|Decals|goldsrc=1|source=1|main=source}}
|en=Decals
}}


[[File:Decal06.jpg|thumb|Декаль, размещенная дизайнером уровней.]] [[File:Decal03.jpg|thumb|Следы от пуль сгенерированные игрой автоматически.]]
{{finishtranslation}}


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


{{note:ru|Каждая декаль влияет только на одну энтити ([[The_world|Мир]] это тоже одна большая энтити)}}
Когда игрок стреляет из своего оружия в стену, на ней остается след, который называется наклейка (decal). Легче всего представить это как невидимый объект, прикрепленный к поверхности. Плакаты, дырки от пуль, буквы на стенах могут быть созданы с помощью наклеек. Наклейки "прилипают" к объектам, на которые они помещены. К примеру налейка на лестнице каскадом спроецируется вниз, а не будет висеть в воздухе. Вы можете так же использовать наклейки для нанесения трафаретных букв на стены, чтобы помечать какие-либо места на вашей карте.


Создать декаль не сложно: это обычный материал, у которого есть ''альфа-канал'' и который использует <code>[[DecalModulate]]</code>.
{{Note|Каждая наклейка влияет (проецируется) только на один объект ({{L|Worldspawn|мир}} - это тоже один большой объект)}}


До того как читать дальше эту статью рекомендуем вам ознакомится со статьей про [[Creating_a_Material:ru|создание материалов]].
Создать наклейку не сложно: это обычный материал, у которого есть ''альфа-канал'' и который использует <code>{{L|DecalModulate}}</code> шейдер.


== Обычные декали ==
До того как читать дальше эту статью, рекомендуем вам ознакомится со статьей про {{L|Creating_a_Material|создание материалов}}.
Самый популярный тип декалей - это декали, которые выглядят как нанесенное через трафарет изображение. Ниже вы можете увидеть исходное изображение, его альфа-канал и финальный вид в игре:


<div style="text-align:center;">[[Image:decal04.jpg|128px|Source color channels]] [[Image:decal05.jpg|128px|Source alpha channel]] [[Image:Decal06.jpg|128px|Decal in the world]]</div>
== Обычные наклейки ==
 
Самый популярный тип наклеек - это наклейки, которые выглядят как нанесенное через трафарет изображение. Ниже Вы можете видеть исходное изображение, его альфа-канал и финальный вид в игре:
 
<div style="text-align:center;">[[File:decal04.jpg|128px|Исходные цвета]] [[File:decal05.jpg|128px|Исходный альфа-канал]] [[File:Decal06.jpg|128px|Наклейка в игре]]</div>


===Параметры материала===
===Параметры материала===
Настройки [[Material:ru|материала]] для декали должны выглядеть примерно так:


  [[LightmappedGeneric]]
Настройки {{L|Material|материала}} для наклейки выглядят примерно так:
 
  {{L|LightmappedGeneric}}
  {
  {
  [[$basetexture]] decals\mydecal
  {{L|$basetexture}} decals\mydecal
  $decal 1
  $decal 1
  $decalscale 0.1
  $decalscale 0.1
  [[$translucent]] 1
  {{L|$translucent}} 1
   
   
  $modelmaterial decals\mydecal_model
  $modelmaterial decals\mydecal_model
  }
  }


; <code>$decal <[[bool]]></code>
; <code>$decal <{{L|bool}}></code>
: Помечает материал как декаль. Без этой метки декаль нельзя будет прикрепить к объекту и спроецировать на него.
: Помечает материал как наклейку. Без этой метки найклейку нельзя будет прикрепить к объекту и спроецировать на него.
; <code>$decalscale <[[float]]></code>
; <code>$decalscale <{{L|float}}></code>
: Параметр, который отвечает за разрешение декали. По умолчанию 1 пиксель изображения принимается за один дюйм в игре. Если исходная текстура декали 128 пикселей по ширине, то ее ширина в игре при настройке <code>$decalscale 0.1</code> будет 12.8 дюймов в игре.
: Параметр, который отвечает за разрешение наклейки. По умолчанию 1 пиксель изображения принимается за один дюйм в игре. Если исходная текстура наклейки 128 пикселей по ширине, то её ширина в игре при настройке <code>$decalscale 0.1</code> будет 12.8 дюймов в игре.
:{{tip:ru|Декаль не может быть отображена с большим разрешением, чем поверхность к которой она прикреплена. [[Hammer_Overlay_Tool|Оверлеи]] могут, но они больше нагружают процессор.}}
:{{tip|Наклейка не может быть отображена с бо́льшим разрешением, чем поверхность к которой она прикреплена. {{L|Hammer_Overlay_Tool|Оверлеи}} могут, но они сильнее нагружают процессор.}}
; <code>$translucent <bool></code>
; <code>$translucent <bool></code>
: См. <code>[[$translucent]]</code>.
: См. <code>{{L|$translucent}}</code>.
; <code>$modelmaterial <material></code>
; <code>$modelmaterial <material></code>
: Материал <code>[[VertexLitGeneric]]</code>, который будет применяться к моделям
: Материал <code>{{L|VertexLitGeneric}}</code>, который будет применяться к моделям.
; <code>$decalfadeduration <float></code>
; <code>$decalfadeduration <float></code>
: Время исчезновения декали. Требует <code>[[$vertexcolor]]</code>.
: Время исчезновения наклейки. Требует <code>{{L|$vertexcolor}}</code>.
; <code>$decalfadetime <float></code>
; <code>$decalfadetime <float></code>
: Задержка перед исчезновением декали
: Задержка перед исчезновением наклейки.
; <code>$decalsecondpass</code>
; <code>$decalsecondpass</code>
: Если выключено, то всегда рендерить эту декаль поверх остальных. Если две декали с этим параметром установленным в <code>true</code> пересекаются, то они ведут себя также, как декали без этого параметра.
: Если выключено, то всегда рендерить эту наклейку поверх остальных. Если две наклейки с этим параметром установленным в <code>true</code> пересекаются, то они ведут себя также, как наклейки без этого параметра.
; <code>$fogscale <float></code>
; <code>$fogscale <float></code>
: {{note:ru|Найдено в L4D2 <code>decals/checkpoint01_black.vmt</code> (использует DecalModulate шейдер)}}
: {{Note|Найдено в L4D2 <code>decals/checkpoint01_black.vmt</code> (использует DecalModulate шейдер)}}


Декали не поддерживают [[$bumpmap]] и [[$envmap]].
Наклейки не поддерживают {{L|$bumpmap}} и {{L|$envmap}}.


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


{{note:ru|Декали, которые должны проецироваться на [[Model:ru|модели]] (например кровь) должны использовать <code>[[VertexLitGeneric]]</code> или <code>[[DecalModulate]]</code>. <code>[[LightmappedGeneric]]</code> будет работать только с [[brush:ru|брашами]].}}
{{Note|Наклейки, которые должны проецироваться на {{L|Model|модели}} (например кровь) должны использовать <code>{{L|VertexLitGeneric}}</code> или <code>{{L|DecalModulate}}</code> шейдер. <code>{{L|LightmappedGeneric}}</code> будет работать только с {{L|brush|элементами мира}}.}}


=== Hammer ===
=== Hammer ===


*Декали могут быть помещены на [[brush:ru|браши]] в Hammer с помощью инструментов '''[[Hammer Overlay Tool:ru|оверлеев]]''' или '''[[Hammer Decal Tool:ru|декалей]]'''. Эти декали будут отображаться сразу после загрузки карты.
* Наклейки могут быть помещены на {{L|brush|браши}} в Hammer с помощью инструментов '''{{L|Hammer Overlay Tool|оверлеев}}''' или '''{{L|Hammer Decal Tool|декалей}}'''. Эти наклейки будут отображаться сразу после загрузки карты.
*Объект [[info_projecteddecal:ru|info_projecteddecal]] может быть использован для проецирования декали на любые браши или модели.
* Объект {{L|info_projecteddecal}} может быть использован для проецирования наклейки на любые браши или модели.


== C++ ==
== C++ ==


Декали могут быть созданы на клиенте с помощью функции <code>C_BaseEntity::AddDecal()</code>. Изнутри она вызывает <code>AddStudioDecal()</code> или <code>AddBrushModelDecal()</code> в зависимости от того, имеет ли энтити браш или модель. Параметры для этих функций:
Наклейки могут быть созданы на клиенте с помощью функции <code>C_BaseEntity::AddDecal()</code>. Изнутри она вызывает <code>AddStudioDecal()</code> или <code>AddBrushModelDecal()</code> в зависимости от того, является ли энтити брашем или моделью. Параметры для этих функций:


<source lang=cpp>void C_BaseEntity::AddDecal( const Vector& rayStart, const Vector& rayEnd, const Vector& decalCenter,
<source lang=cpp>void C_BaseEntity::AddDecal( const Vector& rayStart, const Vector& rayEnd, const Vector& decalCenter,
Line 78: Line 80:
<source lang=cpp>void IVEngineServer::StaticDecal( const Vector &originInEntitySpace, int decalIndex, int entityIndex, int modelIndex, bool lowpriority );</source>
<source lang=cpp>void IVEngineServer::StaticDecal( const Vector &originInEntitySpace, int decalIndex, int entityIndex, int modelIndex, bool lowpriority );</source>


Индексы декалей могут быть получены вызовом <code>decalsystem->GetDecalIndexForName</code> или <code>UTIL_PrecacheDecal()</code>:
Индексы наклеек могут быть получены вызовом <code>decalsystem->GetDecalIndexForName</code> или <code>UTIL_PrecacheDecal()</code>:


<source lang=cpp>int IDecalEmitterSystem::GetDecalIndexForName( char const *decalname ); // Valid decalnames are defined in scripts/decals_subrect.txt
<source lang=cpp>int IDecalEmitterSystem::GetDecalIndexForName( char const *decalname ); // Действующие имена наклеек определены в scripts/decals_subrect.txt
int UTIL_PrecacheDecal( const char *filename, bool preload );</source>
int UTIL_PrecacheDecal( const char *filename, bool preload );</source>


== Использование модуляции ==
== Использование модуляции ==
For decals intended to mimic the look of pock marks or dents in a surface, the <code>[[DecalModulate]]</code> (a.k.a. mod2x) shader is especially suitable: it lightens destination pixels for every source pixel that is over mid-range gray (128) and darkens any destination pixels for every source pixel that is below mid-range gray. This effect can be used to give the impression of depth when applied to a surface.


To begin, create a source image whose color channel will be used for the modulation's source values. Again, light values will lighten pixels they're drawn over, while dark values will darken the destination pixels. Mid-gray values will be treated as translucent.
Для наклеек, предназначенных для имитации выбоин или вмятин на поверхности, шейдер <code>{{L|DecalModulate}}</code> (mod2x) оказывается крайне подходящим: он осветляет целевые пиксели для каждого исходного пикселя, который имеет цвет светлее серого (>128), и затеняет целевые пиксели для каждого исходного пикселя, который имеет цвет темнее серого. Этот эффект может быть использован для придания ощущения глубины, при применении к поверхности.


Next, create an alpha channel that defines a mask for the decal. Because modulation cannot have an exact middle value currently, the mask is necessary to prevent "bordering" from occurring around the decal.
Для начала создайте исходное изображение, цветовой канал которого будет использован для модуляции исходных значений. Еще раз: светлые значения будут осветлять пиксели, поверх которых они нарисованы, в то время как темные значения будут затемнять целевые пиксели. Значения с серым цветом будут рассматриваться как полупрозрачные.


{{Tip|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|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 {{L|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 {{L|Vtex (Source 1)|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.}}
{{todo|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?}}
{{todo|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?}}


<div style="text-align:center;">[[Image:decal01.jpg|128px|Source color channels]] [[Image:decal02.jpg|128px|Source alpha channel]] [[Image:decal03.jpg|128px|Decal in the world]]</div>
<div style="text-align:center;">[[File:decal01.jpg|128px|Исходные цвета]] [[File:decal02.jpg|128px|Исходный альфа-канал]] [[File:decal03.jpg|128px|Наклейка в игре]]</div>


Finally, you must create a material that uses the <code>[[DecalModulate]]</code> shader. Neither <code>$translucent</code> nor <code>$decal</code> are needed this time.
Наконец, вы должны создать материал, который использует <code>{{L|DecalModulate}}</code> шейдер. Ни <code>$translucent</code>, ни <code>$decal</code> в этот раз не понадобятся.


== См. также ==
== См. также ==
* [[Decals in Photoshop]]
* {{L|Decals in Photoshop}}
* [[Decals in GIMP]]
* {{L|Decals in GIMP}}
* [[infodecal]]
* {{L|infodecal}}
* [[info_projecteddecal]]
* {{L|info_projecteddecal}}
* [[info_overlay]]
* {{L|info_overlay}}
 
{{ACategory|Material System}}
{{ACategory|Glossary}}


[[Category:Material System:ru]]
{{ACategory|Material System}}
[[Category:Glossary:ru]]
{{ACategory|Glossary}}
[[Category:Russian]]

Latest revision as of 09:05, 13 May 2025

English (en)Русский (ru)Translate (Translate)
Info content.png
This page has not been fully translated.
You can help by finishing the translation.
If this page cannot be translated for some reason, or is left untranslated for an extended period of time after this notice is posted, the page should be requested to be deleted.
Also, please make sure the article complies with the alternate languages guide.(en)
Наклейка, размещенная создателем карты мира.
Следы от пуль сгенерированные игрой автоматически.

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

Note.pngПримечание:Каждая наклейка влияет (проецируется) только на один объект (мир(en) - это тоже один большой объект)

Создать наклейку не сложно: это обычный материал, у которого есть альфа-канал и который использует DecalModulate(en) шейдер.

До того как читать дальше эту статью, рекомендуем вам ознакомится со статьей про создание материалов(en).

Обычные наклейки

Самый популярный тип наклеек - это наклейки, которые выглядят как нанесенное через трафарет изображение. Ниже Вы можете видеть исходное изображение, его альфа-канал и финальный вид в игре:

Исходные цвета Исходный альфа-канал Наклейка в игре

Параметры материала

Настройки материала(en) для наклейки выглядят примерно так:

LightmappedGeneric(en)
{
	$basetexture(en)	decals\mydecal
	$decal		1
	$decalscale	0.1
	$translucent(en)	1

	$modelmaterial decals\mydecal_model
}
$decal <bool(en)>
Помечает материал как наклейку. Без этой метки найклейку нельзя будет прикрепить к объекту и спроецировать на него.
$decalscale <float(en)>
Параметр, который отвечает за разрешение наклейки. По умолчанию 1 пиксель изображения принимается за один дюйм в игре. Если исходная текстура наклейки 128 пикселей по ширине, то её ширина в игре при настройке $decalscale 0.1 будет 12.8 дюймов в игре.
Tip.pngСовет:Наклейка не может быть отображена с бо́льшим разрешением, чем поверхность к которой она прикреплена. Оверлеи(en) могут, но они сильнее нагружают процессор.
$translucent <bool>
См. $translucent(en).
$modelmaterial <material>
Материал VertexLitGeneric(en), который будет применяться к моделям.
$decalfadeduration <float>
Время исчезновения наклейки. Требует $vertexcolor(en).
$decalfadetime <float>
Задержка перед исчезновением наклейки.
$decalsecondpass
Если выключено, то всегда рендерить эту наклейку поверх остальных. Если две наклейки с этим параметром установленным в true пересекаются, то они ведут себя также, как наклейки без этого параметра.
$fogscale <float>
Note.pngПримечание:Найдено в L4D2 decals/checkpoint01_black.vmt (использует DecalModulate шейдер)

Наклейки не поддерживают $bumpmap(en) и $envmap(en).

Наклейки на моделях

Note.pngПримечание:Наклейки, которые должны проецироваться на модели(en) (например кровь) должны использовать VertexLitGeneric(en) или DecalModulate(en) шейдер. LightmappedGeneric(en) будет работать только с элементами мира(en).

Hammer

  • Наклейки могут быть помещены на браши(en) в Hammer с помощью инструментов оверлеев(en) или декалей(en). Эти наклейки будут отображаться сразу после загрузки карты.
  • Объект info_projecteddecal(en) может быть использован для проецирования наклейки на любые браши или модели.

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

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

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

Tip.pngСовет:You can avoid "bordering" without creating an alpha channel simply by using BGR888 format instead of DXT1 when you create your VTF. Left 4 Dead 2 It has also been observed in Left 4 Dead 2(en) 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(en) 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.
Нужно сделать: 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(en) шейдер. Ни $translucent, ни $decal в этот раз не понадобятся.

См. также