Различия

Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.

Ссылка на это сравнение

q3bers:materials [31.08.2009 08:30]
GT-Agressor
q3bers:materials [25.12.2012 23:56] (текущий)
Строка 1: Строка 1:
 +Оригинальные материалы (.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, и на основании этого сделать вывод. 
 +
 +  * Если первый стейдж не имеет бленда и не $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 
 +
  
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki