With the new lighting engine introduced in patch 81.8193.15, the core shaders of NWN:EE now accepts a number of inputs for generating more advanced content that benefits from the new PBR lighting engine. These can be set by supplying a custom material file that a given model can then refer to, using either the standard "bitmap" field or the designated "materialname" field, as described in the material file format section.

These inputs are used to modulate how meshes applied the material are rendered, generally by informing the renderer with the desired physical properties of the surface of the objects, which the engine will then use to generate results with a high level of realism.

Texture inputs

The main way of supplying these inputs is by special texture maps. You specify these by adding a "texture*" entry in the material file, where "*" is replaced with the index in the table below, followed by your texture name for that input. If using NWN Crunch (recommended), you can also get the tool to generate the material file for you by simply adding certain standardized suffixes to the texture map names instead.

Note that the new standard texture map inputs also all require that the "renderhint" in either the model or the material file is set to either "NormalAndSpecMapped" or "NormalTangents".

Below is an overview of the texture map inputs supported by default.

IndexColor ChannelsDescriptionExample
03 or 4

Base color / diffuse map with optional alpha.

This map affects the color of the diffuse reflection from the material. For metals, it also adjusts the specular reflection color.

If omitted, the material will simply use the texture matching the material name.

If you have a texture named Albedo, this will be your Base color.

Notice: PLT textures can not be designated through material files, so for those, the texture0 entry must be omitted (and the material file must match the name of the PLT texture).


Normal map.

Used to generate the illusion of higher levels of geometric complexity of models when doing lighting. For a basic introduction, see this.

You can supply three channel normal maps (RGB), but only two color channels (red and green) will be used, where green is up (the OpenGL standard).


Specularity map.

Sets the material specularity. As the value goes toward 1 (white), this will also result in the material behaving as metallic, where the diffuse texture will be used for tinting the specular reflection color. For the same reason, a metallicness map can usually work as input for this texture (NWN Crunch also takes metallicness maps as inputs).

If omitted, the renderer will try to approximate a value based on diffuse texture alpha if environment mapped, and use a basic value that fits the average non-metal materials otherwise.


Rougness map.

Sets the material roughness. This map is essential for creating realistic results with the enhanced lighting engine.

If omitted, the renderer will try to approximate values based on specularity (see above).


Height map.

Used for parallax displacement as well as basic light occlusion.

By default, 1 (pure white) is the base level, with lower values resulting in the appearance of depressions in the surface geometry.

If omitted, light occlusion is partly derived from diffuse texture brightness.


Self-illumination map.

Makes the material light up in the color and pattern

The example textures combined produce this result:

Example material file:

renderhint NormalTangents

texture0 tcn01_glas02_D 
texture1 tcn01_glas02_N 
texture2 tcn01_glas02_S 
texture3 tcn01_glas02_R 
texture4 tcn01_glas02_H 
texture5 tcn01_glas02_I 

Other Texture Types

NWN only supports the six material types listed above, however texture sets can come with other types not listed.  Although they can't be added as separate files, two material types can still be used by integrating them into your base texture: Ambient Occlusion; and Opacity.  If you have both, the steps for Opacity should be done first.

Ambient Occlusion

Ambient Occlusion, sometimes called AO for short, is (in other engines) a map that a PBR engine combines with the albedo at render time to define how it reacts to light.  It's the shadows.  The NWN engine uses a diffuse map instead of an albedo but we can still bake an AO map in if it's provided. This texture is the simplest of the two to integrate into the base. 

Presuming it is the same size as your base texture, copy and paste it as a new layer above the base layer then change the Mode from normal to multiply.  Then export the base material as you normally would.


Opacity maps allow and to make parts of your material transparent.

Adding the Opacity map is a little trickier and I only know how to add it using the image editor Gimp. 

First, open the Opacity map file and see what it looks like.  If it's all white, don't bother to add it.  Whitemeans the material is completely opaque.  Check if the base file has an alpha channel.  Remove it if it does.   You will be done and you don't need the extra work below.

If it's all white, you should just add an alpha channel to the base image if it doesn't already have one and leave it.  You will be done.

Otherwise, on the base color right click on the icon of the layer and choose Add Alpha Channel if it doesn't already have one.

Click on the Colors menu→ Components→ Decompose.  Choose RGBA to include the alpha channel.

This will open a new instance of the image where RGB and A are split into separate channels.  The Alpha channel will most likely by all white.  You can see this by hiding the other channels with the eyeball icon.  Either way, select this channel.

Assuming you've already opened the Opacity file in Gimp, and that's its the same size as the base image, copy the Opacity image and paste it into the Alpha channel.

Click on the Colors menu again and choose Components→ Compose this time (the Decompose option won't work).  This will give you a new base and you should see transparencies on the new base texture.  You would export this new file.

Add the Ambient Occlusion, if necessary, then export the new base material.

Parametric Inputs

In addition, the standard shaders accept a number of standard parametric inputs, listed below.

For these to work, you must specify a shader to use in the material file, even if using the default. Usually you will want to just use the standard "vslit_nm" and "fslit_nm".

TypeNameValue rangeEffect
floatRoughness0.001 - 1.0Sets the roughness for the material.
floatSpecularity0.001 - 1.0Sets the specularity for the material.
floatMetallicness0.001 - 1.0Sets the metallicness for the material, which again determines the saturation of the specular reflection color. Normally, this is derived from specularity, but this parameter can be used to override that setting.
floatDisplacementOffset0.0 - 1.0Sets an offset to the base level for displacement when reading the height map. By default, 1.0 (white) is the base level, but with a DisplacementOffset of 1.0, the base level is 0.0, etc.

This is an example material file (used in the core game to make ice appear non-metallic):

customshadervs vslit_sm
customshaderfs fslit_sm
parameter float Metallicness 0.001
parameter float Specularity 0.0179

When defining custom uniforms in a shader, use this suggested notation.

  • If the parameter is a variable used in a function, define the uniform in the shader beginning with a capital Letter, and omit the data type prefix. For example, instead of "fSunshine", use "Sunshine". This helps differentiate between uniforms and shader variables.
  • If the parameter represents a switch, define the uniform in all-caps with underscores between words, like "SUN_POWER"
  • No labels