Оригинальные материалы (.shader) из Quake 3 не совсем подходят для Q3Bers, так как последнему требуется прямо задать какой стейдж (слой) материала должен быть освещаемым.

Пример материала:

textures/gothic_block/blocks17g_ow 
{
 {
 map textures/sfx/firegorre.tga
 tcmod scroll 0 1
 tcMod turb 0 .25 0 5.6
 tcmod scale 1.5 1.5
 blendFunc GL_ONE GL_ZERO
 rgbGen identity
 }
{
 map textures/gothic_block/blocks17g_ow.tga
 blendFunc blend
 rgbGen identity
}
{
 map $lightmap
 blendFunc filter
 rgbGen identity
}
}

Данный материал состоит из трех стейджей. Оснновная текстура - blocks17g_ow.tga, на неё накладывается эффект такой текстурой firegorre.tga, и ещё есть стейдж map $lightmap, который обозначает наложение лайтмапа.

Для того, чтобы Q3Bers понимал, который из этих слоев нужно освещать, нужно в этот стейдж дописать параметр lightStage.

Пример:

textures/gothic_block/blocks17g_ow
{
 {
  map textures/sfx/firegorre.tga
  tcmod scroll 0 1
  tcMod turb 0 .25 0 5.6
  tcmod scale 1.5 1.5
  blendFunc GL_ONE GL_ZERO
 }
 {
  map textures/gothic_block/blocks17g_ow.tga
  blendFunc blend
  lightstage
 }
 {
  map $lightmap
  blendFunc filter
 }
}

Также здесь намеренно убраны строки rgbGen identity, которые не нужны вообще.

Правила:

Научиться визуально на лету определять какой стейдж является освещаемым. Если непонятно, можно посмотреть как выглядит этот материал в Quake 3, и на основании этого сделать вывод.

В шейдерах террайнов в TeamArena есть засада: есть два lightStage в шейдере, но они не дырявые, а логика light pre-pass требует хранения в G-буфере пиксела только одного видимого стейджа. А эти стейджи плавно перетекают один в другой. Но этот вопрос решен : движок их объединяет в один пасс _interpolate, так что не заморачивайтесь. Главное, надо чтобы соблюдалось правило:

стейджи 0 и 1 должны: