The shaders in ZDoomGL are designed to make it fairly simple for content creators (mappers or texture artists) to utilize some of
the advanced features available in a hardware engine. These features include blending modes, translations, rotation and scaling.
shader <ORIGTEX> [MORETEX ...]
{
compatibility any
detailTex DTEX1
layer <TEXNAME>
{
alpha cycle sin 1.0 0.0 2.0
blend GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
color cycle cos 1.0 1.0 1.0 0.5 0.5 0.5 2.0
center 0.0 0.0
offset 0.0 0.0
rotate 0.0
rotation 0.0
scale 1.0 1.0
texgen none
vector cycle -1.0 1.0 -1.0 1.0 2.0
vectorFunc sin cos
}
}
compatibility
any | hardware | software
Shaders are broken up into three categories: generic, hardware and software. Hardware and software shaders are to specify seperate
shaders for the OpenGL and software renderer and the generic shaders work for both. Right now software shaders are ignored.
detailTex
texname
This field specifies the detail texture to use. This texture may be a defined texture in the HIRESTEX lump. Currently not implemented.
layer
texname
Shaders are made up of 1 or more texture layers. The texture used is defined by the texname, which is just the name of a texture
or flat. You can also use textures defined in the HIRESTEX lump for shader layers. By specifying how the layers behave with the layer
properties, you can create some interesting effects!
alpha
This specifies the alpha value of the layer. Note that the base layer always takes on the alpha value of the source geometry.
blend
center
normalized x/y coordinate
This allows you to specify the center of rotation for the layer. The normalized values range from 0.0..1.0, where 1.0 is the full width or height
of the texture.
color
You can use this field to modify the color of the layer, allowing you to tint textures without having to apply a translation to them. An rgb triplet
is just the RGB value in floating point form: "1.0 1.0 1.0" would be white and "1.0 0.0 0.0" would be red.
offset
normalized x/y coordinate
This sets the default translation for the layer so you can align textures easily. The normalized coordinate is the same as in center.
rotate
0.0..360.0
Sets the default rotation (in degrees) of the layer.
rotation
0.0..360.0
This sets how far to rotate the layer each second.
scale
x/y value
This is basically a multiplier for the width and height of the layer. A value of "1.0 1.0" would use the actual texture dimensions while a value of
"0.5 0.5" would shrink the texture to half its actual size.
texgen
none | sphere
This allows you to treat the layer as a spherical environment map. If set to "sphere", only the alpha, blend and color fields will affect this
layer.
vector
This sets the distance to pan the layer each second. A value of "1.0 1.0" would pan the texture it's entire width and height each second.
vectorFunc
sin | cos | linear
This sets the cycle method for the vector components. A value of "sin linear" would cycle the vector X component using a sine wave and cycle the vector Y
component linearly.
Cycleable fields allow you to modify the values of certain fields over time between two values. Interpolation can happen in a linear fashion (default),
or can follow a sine or cosine wave, providing a smoother cycle. To cycle a field, just add the keyword "cycle" after the field name, followed by either
"sin" or "cos" if you want a sine/cosine cycle and then the start and end values followed by the cycle duration:
alpha cycle sin 1.0 0.0 2.0
This example would cycle the alpha value between 1.0 (fully opaque) and 0.0 (fully transparent) over two seconds. Cycling the color field is a bit more
complex:
color cycle 1.0 0.0 0.0 0.0 0.0 1.0 4.0
This example would cycle the color between red (1.0 0.0 0.0) and blue (0.0 0.0 1.0) over 4 seconds. The only field that breaks this format is the vector
field. You don't specify the method to cycle in the vector field, but instead use the vectorFunc field:
vector cycle 0.2 0.0 0.1 0.0 8.0
vectorFunc sin cos
This example would cycle the X vector between 0.2 and 0.0 using a sine wave and would cycle the Y vector between 0.1 and 0.0 using a cosine wave over a
duration of 8 seconds.