Система материалов, часть 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 когда-то.
Это не является *основным* режимом работы и традиционным сценарием использования системы материалов. Просто одна из бесчисленных вариаций на тему. Впрочем, повторюсь, в данном ознакомительном посте я не ставлю перед собой цели охватить все возможности этой системы, скорее дать минимальное представление.