Это старая версия документа.
Оригинальные шейдеры из 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, и на основании этого сделать вывод.
- Если первый стейдж не имеет бленда и не $lightmap - то вписываем lightStage.
- Если первый стейдж блендится, смотрим что за бленд: blendFunc GL_ONE GL_ZERO - нет бленда! - вписываем lightStage. прочие blendFunc - прозрачный стейдж. Не пишем lightStage.
- Если alphaFunc GE128 (или другой параметр) - это значит дырявая текстура, скорее всего освещаемая.
- Если первый lightStage-стейдж (не обязательно первый, а вообще в шейдере первый lightStage) имеет blendFunc, то бленд не убирать. Но последующие lightStage-стейджи тогда должны избавиться от blendFunc blend или blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA (что идентично) и вписать alphaFunc GE128.
В шейдерах террайнов в TeamArena есть засада: есть два lightStage в шейдере, но они не дырявые, а логика light pre-pass требует хранения в G-буфере пиксела только одного видимого стейджа. А эти стейджи плавно перетекают один в другой. Но этот вопрос решен : движок их объединяет в один пасс _interpolate, так что не заморачивайтесь. Главное, надо чтобы соблюдалось правило:
стейджи 0 и 1 должны:
- иметь одинаковый rgbGen
- оба стейджа должны быть lightStage или не-lightStage
- blendFunc стейджа0 = нет или (GL_ONE GL_ZERO)
- blendFunc стейджа1 = blend