Adding PBR to Your Mod/ru

From Valve Developer Community
Jump to: navigation, search
Warning.pngПредупреждение:Этот шейдер не работает с LightMapped брашами, однако технически он совместим с ними.
Tip.pngСовет:В Filesrc/utils/common/utilmatlib.cpp найдите метод InitMaterialSystem и в самом конце добавьте g_pMaterialSystem->ModInit();, и попробуйте пересобрать инструменты.
Note.pngПримечание: В некоторых сторонних версиях VBSP эта проблема исправлена. Например в Mapbase Mapbase & Slammin' Source Map Tools Slammin' Source Map Tools.
Note.pngПримечание:Исправлено в Portal 2: Community Edition


Сравнение PBR

Слева: Базовый шейдер Source Engine.
Справа: PBR шейдер.
Not to be confused with Adapting PBR Textures to Source.

Цель этой статьи - показать вам, как реализовать Thexa4's PBR шейдер в вашем Source 2013 Source 2013 моде. Реализация этого шейдера позволит вам использовать metalness/roughness PBR поверхности в материалах.


Вступление

Основная статья:  Physically Based Rendering

Требования

  • Умение компилировать шейдеры.
  • Умение компилировать решения.


Note.pngПримечание:Если вы не знаете, как компилировать шейдеры, или еще не работали с шейдерами в Source Source, рекомендуется сначала прочитать эти статьи: Разработка шейдеров & Ваш первый шейдер

Реализация

Прежде чем делать что-то, нам нужно скачать файлы.


Вы можете сделать это перейдя по ссылкам ниже, нажмите кнопку "Raw" и как только страница загрузится кликните правой кнопкой мыши и выберите "Save As...".

Все что от вас требуется, это сохранить эти файлы в директорию с исходным кодом вашего мода в 🖿src/materialsystem/stdshaders/.


После того как вы завершите сохранение файлов, откройте Filesrc/materialsystem/stdshaders/game_shader_dx9_*.vpc в соответствии с базированием вашего мода (base/hl2mp/hl2/episodic), и добавьте файлы PBR внутрь $Project "Shaders" вот так:

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
$Project "Shaders" { $Folder "Header Files" { $File "common_vertexlitgeneric_dx9.h" $File "common_lightmappedgeneric_fxc.h" $File "common_flashlight_fxc.h" } $Folder "Shader Source" { $Folder "fxc" { $File "pbr_ps30.fxc" $File "pbr_vs30.fxc" $File "pbr_ps20b.fxc" $File "pbr_vs20b.fxc" } $Folder "Headers" { $File "pbr_common_ps2_3_x.h" } $File "mymod_dx9_30.txt" $File "mymod_dx9_20b.txt" } $Folder "Source Files" { $File "pbr_dx9.cpp" } }

Мы делаем это для того, чтобы когда мы обновим решение, файлы появились в обозревателе решений.


Компиляция шейдеров

Нам нужно скомпилировать шейдеры перед их использованием. Создайте 2 файла в 🖿src/materialsystem/stdshaders/ с именем mymod_dx9_30.txt и mymod_dx9_20b.txt, и вставьте это внутрь:

mymod_dx9_30.txt
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
// // vs 3.0 ps 3.0 shaders collection // // These shaders are forced to compile as shader model 3.0 // using the new compiler. // _ps30.vcs // _vs30.vcs // pbr_vs30.fxc pbr_ps30.fxc
mymod_dx9_20b.txt
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
// // Standard shaders collection // // These shaders are compiled as the following shader models: // _ps20.vcs // _ps20b.vcs // _vs20.vcs // pbr_vs20b.fxc pbr_ps20b.fxc


Добавление этих новых текстовых файлов для компиляции шейдера, позволит вам скомпилировать PBR шейдер без влияния на стандартные Shader-ball.png LightmappedGeneric шейдеры.

Это также значительно сократит время компиляции.


Теперь откройте Filebuildsdkshaders.bat используя текстовый редактор и измените эту часть:

C:

%BUILD_SHADER% stdshader_dx9_20b -game %GAMEDIR% -source %SOURCEDIR% %BUILD_SHADER% stdshader_dx9_30 -game %GAMEDIR% -source %SOURCEDIR% -dx9_30 -force30

На:

%BUILD_SHADER% mymod_dx9_20b -game %GAMEDIR% -source %SOURCEDIR% %BUILD_SHADER% mymod_dx9_30 -game %GAMEDIR% -source %SOURCEDIR% -dx9_30 -force30

Это позволит вам использовать наши текстовые файлы, которые мы создали ранее, чтобы скомпилировать наш PBR шейдер.


Icon-Important.pngВажно:Если вы используете Visual Studio 2013 не забудьте поменять версию инстурментов в Filebuildsdkshaders.bat


C:

call "%VS100COMNTOOLS%vsvars32.bat"

На:

call "%VS120COMNTOOLS%vsvars32.bat"


После этого, мы можем начать компиляцию нашего шейдера запустив Filebuildhl2mpshaders.bat, Filebuildhl2shaders.bat или Filebuildepisodicshaders.bat в зависимости от того, на чем базируется ваш мод.

Убедитесь что следовали статье Разработка шейдеров до того момента, когда вновь скомпилированные шейдеры будут правильно помещены в папку вашего мода 🖿shaders/fxc/.

Note.pngПримечание:В зависимости от вашего ПК и сложности шейдера, это может занять некоторое время.


Если шейдеры скомпилировались без проблем, вернитесь назад в вашу директорию с исходым кодом 🖿src/ и запустите Filecreateallprojects.bat.


Откройте решение и скомпилируйте шейдеры в Release.

Note.pngПримечание:Если 🖿pbr_dx9.cpp нету в Shader проекте. Убедитесь, что вы правильно подключили его в .vpc файле который вы редактировали ранее.


Исправления

Физические пропы становятся черными, если используют материал с PBR шейдером, после 2-3 секунд из-за Prop Sleeping. После указанного времени, пропы "запекают" свой свет для оптимизации.

Вы можете обойти это написав r_PhysPropStaticLighting 0 в консоли или прописать в Filesrc/game/client/c_physicsprop.cpp.

Вот, как вы можете прописать это в коде:

Под #include "tier0/memdbgon.h" добавьте это:

#define PBR_CHANGE

Затем найдите ConVar r_PhysPropStaticLighting("r_PhysPropStaticLighting", "1"); и замените его данным условием:

#ifdef PBR_CHANGE
	ConVar r_PhysPropStaticLighting( "r_PhysPropStaticLighting", "0" );
#else
	ConVar r_PhysPropStaticLighting( "r_PhysPropStaticLighting", "1" );
#endif


Параметры

  • $basetexture - Albedo текстура.
  • $normaltexture - карта нормалей (для обратной совместимости).
  • $bumpmap - карта нормалей (новый вариант указания карты нормалей).
  • $mraotexture - Текстура с metalness на красном канале, roughness на зеленом канале и ambient occlusion на синем канале.
  • $speculartexture - Включает использование цветной F0 (карты отражений), перезаписывая текстуру с metalness из MRAO текстуры.
  • $emissiontexture - Позволяет установить текстуру c emission. Включает self illumination .
  • $useenvambient <boolean> - Позволяет использовать самый низкий уровень mip карт кубмапов для окружающего освещения вместо кубов окружения. Может вызывать артефакты при перемещении пропов.
  • $envmap - По умолчанию "env_cubemap", но также позволяет исвользовать свой вариант.
  • $surfaceprop - Связывает поверхность материала или модели с набором физических свойств.
  • $model - Должно иметь значение "1" если материал используется для пропа.
  • $translucent - Установка данного параметра на "1" включает Alpha-смешивание.
  • $basetexturetransform - Выглядит так: "center 0.5 0.5 scale 0.1025 0.1025 rotate 0 translate 0 0" для 2m на 2m текстуры.
  • $alphatest - Позволяет обрезать пиксели, когда альфа-значение опускается ниже $alphatestreference.
  • $alphatestreference - Задаёт минимальное значение цвета альфа-канала, в котором эффект округляется до 255. Значение «.3» создаст более толстую форму, а значение «.7» создаст более тонкую форму.
  • %keywords - Список ключевых слов разделенных запятыми. Примеры ключевых слов: architectural,brown,gray,grime,hanger,industrial,metal,modern,shed,urban,wall,floor
  • $useparallax <boolean> - Использовать Parallax Occlusion Mapping.
  • $parallaxdepth <float> - Гулибна Parallax карты.
  • $parallaxcenter <float> - Средняя глубина Parallax карты
Note.pngПримечание:$emissiontexture - текcтура содержит цвет, это не маска.
Icon-Bug.pngОшибка:По умолчанию, все тени направлены относительно игрока, как если бы он держал источник света у себя в руках, а не использовал внешние.


Примеры

Браш (не модельные поверхности), образец материала

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
PBR { $basetexture "pbr_asset/texture_albedo" $bumpmap "pbr_asset/texture_normal" $mraotexture "pbr_asset/texture_mrao" $envmap "env_cubemap" $surfaceprop "metal" $model 0 }

Модель, образец материала

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
PBR { $basetexture "models/pbr_asset/texture_albedo" $bumpmap "models/pbr_asset/texture_normal" $mraotexture "models/pbr_asset/texture_mrao" $envmap "env_cubemap" $surfaceprop "metal" $model 1 }

Модель, образец материала с картой отражений

Note.pngПримечание:Канал Metalness игнорируется и Shader-ball-settings.png $basetexture обрабатывается как diffuse.
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
PBR { $basetexture "models/pbr_asset/texture_diffuse" $bumpmap "models/pbr_asset/texture_normal" $mraotexture "models/pbr_asset/texture_mrao" $speculartexture "models/pbr_asset/texture_specular" $envmap "env_cubemap" $surfaceprop "metal" $model 1 }


Note.pngПримечание:В Shader-ball-settings.png $envmap следует оставить"env_cubemap".
Warning.pngПредупреждение:Для работы материалов моделей, с использованием PBR, Shader-ball-settings.png $model 1 ДОЛЖЕН быть добавлен в материал!

Вывод

Вот и все! Теперь в вашем моде есть PBR.