Creating Custom Shaders
Author: Sine Nomen
Part 1: Basic Light Shaders
This is probably the most useful and common shader you'll come across. The basic syntax is pretty straightforward:
textures/tutorial/shader1
{
qer_editorimage textures/doomgiver/light1d
{
map $lightmap
}
{
map textures/doomgiver/light1d
blendFunc GL_DST_COLOR GL_ZERO
}
{
map textures/doomgiver/light1dglow
blendFunc GL_ONE GL_ONE
}
}
textures/tutorial/shader1
← This format is standard for all
shaders. When creating your own shader, replace 'tutorial' with a folder
name of your choice. If you're using custom textures, you might want to
put them in a physical folder of the same name in gamedata/base. Replace
'shader1' with whatever you want your new shader to be called.
qer_editorimage textures/doomgiver/light1d
← This line is used only
by the editor; it's not absolutely necessary, but it prevents your
shader from showing up as 'texture not found' in Radiant. You can use
whatever texture you like for this; the most common is just the basic
shader texture.
map textures/doomgiver/light1d
← This is the basic shader texture
(often used in the editorimage stage as well). In other words, it's the
texture you're plugging into the shader to make it glow. This is the
first stage.
map textures/doomgiver/light1dglow
← This is the texture that tells
JO which part of the shader will appear to glow. The brightness and
color of the light in JO is dictated by the brightness and color of this
texture. This is the second stage.
Part 2: Basic Shaders That Emit Light
textures/nar2/window2
{
q3map_lightimage textures/doomgiver/light1dglow
qer_editorimage textures/doomgiver/light1d
q3map_surfacelight 340
q3map_lightsubdivide 128
{
map $lightmap
}
{
map textures/doomgiver/light1d
blendFunc GL_DST_COLOR GL_ZERO
}
{
map textures/doomgiver/light1dglow
blendFunc GL_ONE GL_ONE
}
}
A few more lines are needed to make the shader actually emit light on to the surrounding surfaces.
q3map_lightimage textures/doomgiver/light1dglow
← This texture is
usually the same one used in the second stage. An average color is drawn
from this texture and used to define the color of the light it emits.
Alternatively, you can enter a numeric RGB value here:
q3map_lightrgb .9803 .9843 1
The value of this color on a regular 255 point RGB scale is, for example, 250, 251, 255. Take each digit and divide it by 255 to get a normalized number for use in your shader.
q3map_surfacelight 340
← This is the strength of the emitted light.
How it translates into JO depends on a number of factors, so you'll have
to experiment to get it to your liking.
q3map_lightsubdivide 128
← This line is necessary only if you're
using Q3MAP2 to compile your map. All light-emitting shaders do is
create a series of small point lights (like the ones you'd place in
Radiant) according to the values you enter. This tells the compiler how
far apart to place them.
Part 3: Implementing Your Shader in Radiant and JO
The syntax of a shader goes in a .shader file (rename the extension of a .txt file), which in turn goes in the gamedata/base/shaders folder. Open shaderlist.txt, found in the same folder, and add the name of your .shader file to the list. Example:
...
sprites
system
test
text_crawl
tutorial
ui
yavin
zoom
...
...and that's it. Open Radiant and you should see the name of your .shader in the texture menu. Be sure to include the /shaders folder in your .pk3 (with only your custom .shader) when you release it. Good luck.