This article's documentation is for anything that uses the Source engine. Click here for more information.

$ssbump

From Valve Developer Community
Jump to: navigation, search
English (en)Translate (Translate)

$ssbump is a material shader parameter available in all Source Source games since Source 2007 Source 2007.

Comparing SSBump with standard bump mapping and no mapping at all.

It is a boolean parameter that flags a $bumpmap texture as being a self-shadowing bump map.

Standard bump maps only darken texels that are facing away from a light source. Self-shadowing bump maps darken both texels facing away and also any texels which are 'behind' them, similar to Ambient Occlusion maps in modern game engines. You can read more about the technology behind it in this paper.

Tip.pngTip:Self-shadowed normal mapping actually renders faster than standard normal maps! The precise reasons for this can be found in the paper above (see pages 1, 4 and section 3).

Example

rockwall_cave_02a_height-ssbump.vtf
A simpler example: each surface is flat.
rockwall_cave_02a_height-ssbump.vmt
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
LightmappedGeneric { $basetexture nature/rockwall_cave02a $surfaceprop concrete $bumpmap nature/rockwall_cave_02a_height-ssbump $ssbump 1 $ssbumpmathfix 1 }
Note.pngNote:An ssbump can also be used as a detail texture on non-fullbright brushes and displacements, with blend modes 10 or 11 being automatically chosen if the texture has the ssbump VTF flag, depending upon whether the material has a normal map.

$ssbumpmathfix

The parameter addresses an issue with SSBump Textures being too bright.
It can be found in the VMT's of Alien Swarm Alien Swarm, Counter-Strike: Global Offensive Counter-Strike: Global Offensive, Left 4 Dead 2 Left 4 Dead 2, Black Mesa Black Mesa and Portal 2 Portal 2
However the Parameter itself does not appear to be functional in some of them.

Confirm:Which one does it work in? Confirmed : Left 4 Dead 2
Note.pngNote:Does not work in Counter-Strike: Global Offensive, textures appears fine however and don't overbright!

The Parameter addresses an issue where SSBump's unlike their Normal Map counter parts are non-unit Vectors.
More specifically, unlike the .x and .y components of the Bump Basis, the .z components don't cancel out.
The maximum range of the result, is equal to the sum of the .z components. 3* (1.0f / sqrt(3.0f)) or 1.73205f
This causes SSBumps to be MUCH too bright.
Luckily, this can retroactively be accounted for by multiplying the result with Desired_Range / Current_Range or numerically1.0f / 1.73205f

Note.pngNote:It can easily be tested that this fix is applied in Left 4 Dead 2 Left 4 Dead 2 using the following method.

1. Compare a $SSBump material using $SSBumpMathFix and a $Color value of 1.73205, with the same material without both.

2. Compare a $SSBump Material using $SSBumpMathFix, with the same material without $SSBumpMathFix and a $Color value of 0.57735
Icon-Important.pngImportant:This issue appears to affect most, if not all, publicly available SSBump Generators! Including Valves!!
Tip.pngTip: You can use this knowledge to your advantage! This fix can still be applied, even in Source Branches that don't have native support for $SSBumpMathFix!

Multiply your $Color Parameter with the Value 0.57735, or in case you don't have $Color yet simply add it with that Value!

This works because $Color is applied specifically to the Lightmap, in the Shader.

Limitations

The shadows cast by the bump map are permanently baked into the texture, meaning that they can only appear in one of three predefined locations. height2ssbump generates shadows for light arriving from the right, top-left, and bottom-left of the texture.

Tip.pngIdea:Add angles or specific description of exactly what direction each channel's "light" uses

If light arrives from between those directions (such as from the left), the nearest available baked shadows are blended between, producing an acceptable but hardly ideal image.

Additionally, in order to preserve the illusion of height, low areas of a SSBumped material will receive less light even if it arrives head-on. This can look odd if you have too intense (rugged) a SSBump.

Creation

You need to use height2ssbump, a command line SDK tool. The command is:

height2ssbump <options> <path\to\heightmap.tga> <float|bumpscale>

The output is <input name>-ssbump.tga, in the same folder as the input file. Bumpscale controls the intensity of the ssbump (i.e., coarseness of the surface).

Note.pngNote:Bizarrely, the tool examines only the alpha channel of the input TGA. The original alpha channel will be passed on to the output TGA, but serves no purpose and should be deleted. A tutorial on how to embed a heightmap in an image's alpha channel can be found here (While this is for embedding it in the alpha channel of a normal map, the same procedure still applies).
Warning.pngWarning:Height2SSBump may crash if it is given too large of an input image. Images 2048x2048 or greater are confirmed to crash the tool.
Icon-Bug.pngBug:height2ssbump is currently non-functional in Strata Source Strata Source games. Use Portal 2 Portal 2's instead. For users with Prime Status, Counter-Strike: Global Offensive Counter-Strike: Global Offensive's is also an option (switch Counter-Strike 2 Counter-Strike 2 to the csgo_legacy branch and install the Counter-Strike: Global Offensive Authoring Tools Counter-Strike: Global Offensive - SDK necessary to access height2ssbump)  [todo tested in?]

You can use normal2ssbump, another SDK tool, to generate an SSBump from a normal bump map (as opposed to a height or displacement map) - Unlike height2ssbump you do not need to run through the command line or use any additional parameters; simply drag-and-drop your normal map onto the program or a shortcut.

Tip.pngTip:If you are generating an SSbump from a Valve-created heightmap, you may need to remove the alpha channel from the heightmap first, and then copy the Green channel into a replacement Alpha channel in order to generate the SSbump correctly. This can be caused by leftover Specular maps in the Alpha channel most likely used in the generation of Env map masks that are stored in the alpha channel of a Normal map and enabled via the $normalmapalphaenvmapmask material parameter.
Difference in generating an SSbump from Valve heightmaps that have preexisting alpha channels.
A showcase of how bumpscale values affect the output of height2ssbump.


Options

<path/filename>
The source heightmap (TGA format).
-r <int>
Set the number of 'rays' (default 250). More rays take more time.
-n
Generate a conventional bump map as <input name>-bump.tga.
-d(in all games since Left 4 Dead)(also in Source 2013)
Generate an ssbump detail texture, used with $detailblendmode 10 and 11.
Confirm:How does this differ from a making regular SSBump? public/bitmap/float_bm.h has a description.
-A
Generate ambient occlusion in the alpha channel.
-f <int>
Set smoothing filter radius (default 10; 0 disables).
-D
Write out filtered result as filtered.tga.

An example of a complete command is:

height2ssbump -r 275 "C:\Path\to\example-height.tga" 35


Third Party Tools

Third-party tools capable of generating SSbump maps:

Confirm:Most of these tools support generating SSBumps from heightmaps and/or normal maps, but do any of them support baking an existing AO map into the generated SSBump?