Adding PBR to Your Mod
The goal of this article is to show you how to implement Thexa4's PBR shader into your own mod. Implementing this shader will allow you to use the metalness/roughness PBR workflow in materials.
- Ability to compile shaders.
- Ability to compile the solution.
Before doing anything, we need to download the files we need.
You can do this by going to the links below, clicking the "Raw" button and once the page has loaded right-click and select "Save As...".
Then all you have to do is save each one of the files to your Source mod's code directory under
After you've finished saving the files, open the
src/materialsystem/stdshaders/game_shader_dx9_*.vpc file appropriate for your situation (base/hl2mp/hl2/episodic), and add the PBR files within
$Project "Shaders" like so:
We do this so that when we refresh the solution they will appear in the solution explorer.
We need to compile the shaders that we have before we can use them. Create two files in
mymod_dx9_20b.txt and add this inside:
Adding new text files for shader compilation will allow you to compile the PBR shaders without affecting the standard
This will also reduce compile times significantly.
Now open the
buildsdkshaders.bat file using Notepad and edit this part below from:
This will allow you to use the custom text file that we made earlier to compile our PBR shader.
After that, we can now start the shader compilation by running
buildepisodicshaders.bat depending on your mod's base.
Make sure you've followed the Shader Authoring article to the point where the newly compiled shaders will be properly placed on your mod's
If the shaders compile without problems, go back to your source code directory
src/ and run
Run the solution and build shaders in
Physics props turn black when used with the PBR shader after 2-3 seconds due to Prop Sleeping. After a set time, props "bake" their lighting for optimization.
You can bypass this by typing
r_PhysPropStaticLighting 0 on the console or by hardcoding it in
Here is how you can hardcode it:
#include "tier0/memdbgon.h" add this:
ConVar r_PhysPropStaticLighting("r_PhysPropStaticLighting", "1"); and turn it into this:
#ifdef PBR_CHANGE ConVar r_PhysPropStaticLighting( "r_PhysPropStaticLighting", "0" ); #else ConVar r_PhysPropStaticLighting( "r_PhysPropStaticLighting", "1" ); #endif
- $basetexture - The albedo texture.
- $normaltexture - Sets the normal map (for backwards compatibility).
- $bumpmap - Sets the normal map (new way of setting normalmap).
- $mraotexture - A texture with the metalness on the red channel, roughness on the green channel and ambient occlusion on the blue channel.
- $speculartexture - Enables use of colored F0 (specular map), overrides metalness from MRAO texture.
- $emissiontexture - Allows setting an emission texture. Enabled self illumination.
- $useenvambient <bool> - Makes it use the lowest mip level of the cubemap for ambient light instead of the ambient cubes. Can cause artifacts with moving props.
- $envmap - Defaults to "env_cubemap", allows you to use a custom one.
- $surfaceprop - Links the surface of either a material or model to a set of physical properties.
- $model - Should have a value of "1" if the texture is used on a prop.
- $translucent - Setting this to "1" enables alpha blending.
- $basetexturetransform - Looks like this: "center 0.5 0.5 scale 0.1025 0.1025 rotate 0 translate 0 0" for a 2m by 2m texture.
- $alphatest - Enables clipping the pixel when the alpha goes below $alphatestreference.
- $alphatestreference - Specifies the minimum color value of the alpha channel in which the effect is rounded to 255. A value of ".3" will create a thicker shape while a value of ".7" will create a thinner shape.
- %keywords - A list of keywords separated by commas. Examples of keywords are: architectural,brown,gray,grime,hanger,industrial,metal,modern,shed,urban,wall,floor
- $useparallax <bool> - Use Parallax Occlusion Mapping.
- $parallaxdepth <float> - Depth of the Parallax Map
- $parallaxcenter <float> - Center depth of the Parallax Map
Brush (non-model surfaces) material example
Model material example
Model material example with specular map
And that's it! You should now have PBR in your mod.