January 15

Система материалов, часть 6

Кроме доступа к глобальным настройкам и текущим параметрам рендеринга вы так же можете получить доступ к произвольным переменным внутри энтить, т.е. из HeadShot. С учётом того, что эти переменные будут сперва пересланы на клиент, а затем проброшены в систему материалов и через юниформ попадут в шейдер. Обращаю ваше внимание, что всё это делается без какой-либо модификации исходного кода движка.

Аналогичным образом вы можете получить доступ и к глобальным переменным, объявленным на сервере - обычно это удобно для создания системы смены времени суток или чего-то подобного, когда положение солнца, ветра контролируется на серверной части игры. Пример подобной реализации будет доступен в будущем бета-тесте.

Важный момент! Всё описание материала используется только как набор инструкций для построения оптимального VBO, загрузки нужных текстур и компиляции шейдера. Т.е. материалы читаются только во время загрузки уровня один раз. А любые динамические изменения во время игры происходят непосредственно в шейдере. Впрочем некоторые условия могут выполняться и непосредственно в самом материале. Ниже приведён пример реализации т.н. рендермодов "rendermode" из Half-Life.

    beginStateCondition( "entity->rendermode", kRenderTransColor );
      blendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
    endStateCondition();
    beginStateCondition( "entity->rendermode", kRenderTransTexture );
      blendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
      depthMask( GL_FALSE );
    endStateCondition();
    beginStateCondition( "entity->rendermode", kRenderTransAlpha );
      alphaFunc( GL_GREATER, 0.0f ); // same as in GoldSrc
    endStateCondition();
    beginStateCondition( "entity->rendermode", kRenderTransAdd );
      blendFunc( GL_SRC_ALPHA, GL_ONE );
      depthMask( GL_FALSE );
    endStateCondition();


Константы kRenderTransAdd и прочие - это просто макросы такого плана:

#define kRenderNormal  0  // src
#define kRenderTransColor  1  // c*a+dest*(1-a)
#define kRenderTransTexture  2  // src*a+dest*(1-a)
#define kRenderGlow    3  // src*a+dest -- No Z buffer checks
#define kRenderTransAlpha  4  // src*srca+dest*(1-srca)
#define kRenderTransAdd  5  // src*a+dest

функции blendFunc, depthMask и аналогичные - являются встроенными функциями системы материалов. Обращение к "entity->rendermode" - доступ к пользовательской переменной из клиентского объекта, он может быть любым.
Т.е. мы можем добавлять здесь различные глобальные режимы рендеринга, опять таки не меняя код самого движка. И динамически переключать их на лету, как и в самой Half-Life когда-то.

Это не является *основным* режимом работы и традиционным сценарием использования системы материалов. Просто одна из бесчисленных вариаций на тему. Впрочем, повторюсь, в данном ознакомительном посте я не ставлю перед собой цели охватить все возможности этой системы, скорее дать минимальное представление.

Продолжение следует