...
Using shaders you can alter the graphical presentation of textures and models. See Shader Engine Support for details on how the engine pushes uniforms and default defines to the shader files.
| Table of Contents |
|---|
Basic Shader Overview
...
Generally you don't want to override the games default shaders; need to edit in here when tested since it might only be possible to do at game launchbut if you have to you'll also have to gate what version you're loading for since engine changes can render older shaders inoperable on newer versions of the game.
Stock Shader Files
Shader files are generally in the base_shaders.bif file - extract this most easily with NWN Explorer. Up until relatively recently the shader files may have undergone significant changes and were included in the /ovr folder in the game installation directory. These were folded back into the bifs later.
...
Define / Default Values List
(Note should move this to Shader Engine Support at some point for single source of truth)
This is a list of defines. This is a list of defines. You can use them in if statements:
...
The Version Added field only is filled in if the value wasn't available to begin with when shaders were first added.
| Define Name | Example | Version AddedCompatibility | Notes | ||
|---|---|---|---|---|---|
#version 300 es precision highp float; | Mobile | If mobile this will be defined (open GL version etc.) | |||
#version 330 core #define mediump #define lowp #define highp | Non-Mobile | If not mobile this will be defined (open GL version etc.) | |||
#define MAX_NUM_LIGHTS | 3 | Same as the client setting for Maximum Number of Lights | |||
#define MAX_NUM_BONES | 64 | This can vary across some versions but now is standardised to 64. | |||
#define GAMMA_CORRECTION | 1 or 0 | Gamma Correction game setting on/off | |||
#define FRAGMENT_LIGHTING | 1 or 0 | Fragment Lighting game setting on/off | |||
#define SHADER_QUALITY_MODE | 0, 1 or 2 | Shader quality mode game setting (low, medium, high) | |||
#define KEYHOLING_ENABLED | 1 or 0 | Keyholing game setting on/off | |||
#define SHADER_DEBUG_MODE | 1 or 0 | Shader debug mode on/off | |||
#define BUILD_VERSION | 8193 | This is very unlikely to change for MP servers - since the server version must match the client version - but can perhaps matter for SP modules if they want to support older versions. You can still safely use this with the BUILD_REVISION to get a more accurate picture. | |||
#define BUILD_REVISION | 35 | This is the incremental patch number at the end of the patch version. Omits the last part, eg: 1.87.8193.35.5 won't show the 5, just be "35" | |||
#define NO_DISCARD | 1 or 0 | Discard enabled or not | |||
#define POSTPROCESSING_TYPES_ENABLED | Bitmask value | See inc_postpr.shd for the bitmask values
| |||
#define varying | out or in | out = is the for types GL_VERTEX_SHADER and in = not vertex shader | |||
#define attribute | in | ||||
#define texture2D | texture | ||||
#define textureCube | texture | ||||
#define gl_FragColor compat_glFragColor out vec4 compat_glFragColor; | Only added if a fragment shader |
Shader
...
Uniforms
These are essentially variables in a sense of they are determined at that particular frame for a particular pixel depending on what the engine has there at the time. These need adding if not already defined in the shader (many default game shaders define these already).
...
See Shader Engine Support for more details on this and a complete list of what is available.
To utilise them sometimes they need defining since a default include file isn't using them.
For instance vCustomColor is usable by this style of code, setting in the top level that you want the uniform attribute vCustomColor to be sent to the shader file and then allocate it to the VertexColor variable, which just replaces the contents of that output first sorted in inc_standard and changed with ApplyStandardShader() with the variable contents of vCustomColor directly.
| Code Block | ||||
|---|---|---|---|---|
| ||||
#define VERTEX_COLOR 1
#include "inc_standard"
attribute vec4 vCustomColor;
void main ()
{
ApplyStandardShader();
VertexColor = vCustomColor;
} |
| Code Block | ||||
|---|---|---|---|---|
| ||||
#define VERTEX_COLOR 1
#include "inc_standard"
void main ()
{
FragmentColor = vec4(1.0);
SetupStandardShaderInputs();
ApplyStandardShader();
gl_FragColor = VertexColor;
} |
...
Vertex Colors
...
vCustomColor
...
No
...
SHD Format
Shaders are relatively standard text files, written in c-like code. See Shader Engine Support for what shader uniforms and defines are available from the engine.
Generally each shader you'll want to use for model texture changes will include "inc_standard". They also will use #define to setup what the shader file will do. For instance fslit_nm has the normal, specular, roughness height and self-illumination maps set (the "nm" means "normal maps"):
...