Decals: Difference between revisions
TomEdwards (talk | contribs) No edit summary |
TomEdwards (talk | contribs) |
||
Line 20: | Line 20: | ||
*<code>$decal</code> marks the material as a decal. Without it, the decal will not be clipped or projected onto the world properly. | *<code>$decal</code> marks the material as a decal. Without it, the decal will not be clipped or projected onto the world properly. | ||
*<code>$decalscale</code> is important because its default is one pixel to one inch. If the source texture for this decal is 128 pixels, a value of <code>0.1</code> will cause it to be 12.8 inches in size in the engine (about a foot). | *<code>$decalscale</code> is important because its default is one pixel to one inch. If the source texture for this decal is 128 pixels, a value of <code>0.1</code> will cause it to be 12.8 inches in size in the engine (about a foot). | ||
*:{{tip|A decal can't be drawn at a higher resolution that the texture it's applied to. [[Hammer Overlay Tool|Overlays]] can, but they are more [[expensive]].}} | |||
*<code>$translucent</code> specifies that the material should use the alpha channel of the [[albedo]] to mask transparent sections of the material. | *<code>$translucent</code> specifies that the material should use the alpha channel of the [[albedo]] to mask transparent sections of the material. | ||
Revision as of 09:06, 13 July 2008
When the player shoots his or her weapon into a wall, the marks left by the bullet impacts are called "decals". These are most easily thought of as materials that are applied to a surface and remain there as an indelible mark on the world. Posters, scorch marks, and stenciled letters can all be created using this type of graphic. Decals will clip their extents to whatever surface they are placed on to. For example, a decal applied to a staircase would cascade down on to each stair surface instead of hanging out into space. You can also think of this as how a stencil would apply a mark to the world.
Creating decals is straightforward: they are simply materials generally having an alpha channel mask of some sort, and possible using the DecalModulate
shader. Before reading this article, please read about the basics of material creation.
Standard decals
The most simple type of decal is one that simply acts like a true decal or stencil: source art is clipped and projected on to the world within some mask, specified via the material's alpha channel (centre):
A decal's material looks something like this:
LightmappedGeneric { $basetexture decals/mydecal $decal 1 $decalscale 0.1 $translucent 1 }
$decal
marks the material as a decal. Without it, the decal will not be clipped or projected onto the world properly.$decalscale
is important because its default is one pixel to one inch. If the source texture for this decal is 128 pixels, a value of0.1
will cause it to be 12.8 inches in size in the engine (about a foot).$translucent
specifies that the material should use the alpha channel of the albedo to mask transparent sections of the material.
Application
Once the material has been created the decal can be placed in Hammer with the Overlay or Decal tools.
Decals can be created in C++ via
.

VertexLitGeneric
shader should be used instead of LightmappedGeneric
. LightmappedGeneric
is used for decals applied to world geometry.Using modulation
For decals intended to mimic the look of pock marks or dents in a surface, the DecalModulate
(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.
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.
Finally, you must create a material that uses the DecalModulate
shader. Neither $translucent
nor $decal
are needed this time.