Rendering and Shaders
Converter Tool
NOTE: The Converter replaces the MAX script plugin for exporting units. The converter can accept FBX files from most 3D tools.
Valid map slots to be used are Diffuse, Specular Colour, Glossiness, and Bump (which is the normal map). The exporter should correctly handle baked materials. The maps are available in the game shaders in the following order in samplers [0-3].
Diffuse Normal Specular Gloss
Tool Controls
Hold LMB - rotate camera Hold RMB - pan camera Mousewheel - zoom RETURN - reset camera L - cycle through lights SPACE - toggle camera light F1 - reload shaders
SHIFT+Click on texture button to clear texture from it
CONFIG File
If a CONFIG.TXT file is found in the same folder as the EXE, it can contain the following:
Shader Path
Must be at the top of the file, optional. Points to a folder where a CORE/SHADERS folder exists, allowing you to point the tool to the shaders being used by (e.g.) your game data.
COREPATH C:\development\mygame\
Texture Paths
Multiple texture paths which are searched in order for any textures
[TEXTURES]
PATH <texturePath>
PATH ...
Lights
Multiple lights can be set up, each light must be a triplet of direction, colour, and ambient
[LIGHTS]
DIRECTION <vector>
COLOUR <hex>
AMBIENT <hex>
DIRECTION ...
An example CONFIG file is
[TEXTURES]
PATH C:\DATA\BATTLE\UNITTEXTURES
PATH C:\DATA\TEXTURES
[LIGHTS]
DIRECTION 0 -1 0
COLOUR FFFF0000
AMBIENT FF003300
DIRECTION 1 0 0
COLOUR FFFFFF00
AMBIENT 0
Default Shaders
The system loads and uses some specific default shaders for specific types of rendering from CORE/SHADERS. These are:
screenrgba.txt font.txt grey.txt screenrgba_solid.txt
The above shaders are used for standard UI object rendering and font drawing, and will generally not be changed by the user.
lit.txt - draw standard lit objects (lit via normals) prelit.txt - draw prelit objects (vertex colour stored in vertex data) normal.txt - draw objects with normal mapping (vertex data includes tangent space info) lit_skin.txt - draw as per lit.txt but with hardware skinning normal_skin.txt - draw as per normal.txt but with hardware skinning
These shaders are generally the ones that you will customise to your specific workflow and texture setups.
Custom Shaders
Custom shaders can be used in two ways. Either include a new shader in the base SHADERS folder and use the tool to apply it to the applicable meshes. This however can be fiddly if you have combined shader types (e.g. skinned/non-skinned) and requires you to create versions in the 1 folder for shadowing.
A simpler approach is often to use the Style system. To create a new style you add a numeric folder to the SHADERS folder (note that style 1 is always used for shadow generation). So for example, if you wanted a specific type of normal-mapped skinned shader you would create a new folder, say 5, and copy in your default normal_skin.txt shader file. You then alter the 5/ version as desired. Then you can use the numeric buttons in the tool to apply a style to a given model and save it out. Note that if a shader cannot be found in the style folder then the system will fall back to using the default version.
Shader input data
When writing shaders, the following registers can be assumed to be filled
- world matrix c0
- view matrix c4
- projection matrix c8
- WVP combo c12
- light data (dir, colour, ambient, fill colour) c16
- world Normal matrix c20
- shadowmap lighting trx combo c24
- camera position vector c28
- camera look vector c29
- C30 is sometimes used to store 4 pseudo random (integers as floats) numbers constant for a given instance of a mesh (e.g. per unit currently)
- c31 fogging. xyz are the RGB values, w is start + (65536*end). Decoding example below.
- c32 assume all past here are bones
Fogging Decode Example
float4 fog : register(c31) ; ... float start, end ; float a, dist; end = round(fog.w/65536.0) ; start = fmod(fog.w, 65536.0) ; distV = In.drawPos - gEyePos.xyz ; dist = length(distV) ; a = dist ; a -= start ; a = a/(end-start) ; a = saturate(a) ; outputColour.xyz += a * fog.xyz ;