ZDoomGL Shader Documentation


  1. Overview
  2. Components of a Shader
  3. Cycleable Fields
  4. Credits
  5. Contact

1. Overview

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.

2. Components of a Shader

   shader <ORIGTEX> [MORETEX ...]
      compatibility any
      detailTex DTEX1
      layer <TEXNAME>
         alpha cycle sin 1.0 0.0 2.0
         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


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.


This field specifies the detail texture to use. This texture may be a defined texture in the HIRESTEX lump. Currently not implemented.


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!


0.0..1.0 (cycleable)
This specifies the alpha value of the layer. Note that the base layer always takes on the alpha value of the source geometry.


same as glBlendFunc
This allows you to specify the blending mode for this layer. This field mirrors the usage of glBlendFunc: http://www.3dlabs.com/support/developer/GLmanpages/glblendfunc.htm


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.


normalized rgb triplet (cycleable)
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.


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.


Sets the default rotation (in degrees) of the layer.


This sets how far to rotate the layer each second.


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.


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.


x/y value (cycleable)
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.


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.

3. Cycleable Fields

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.

4. Credits

There are a few people who really helped bring this whole system into being, and I'd like to take the time to thank them here.

5. Contact

Feel free to contact me with questions or comments!
web: http://zdoomgl.mancubus.net/
email: zdoomgl@zdoom.org