Ru/Adding PBR to Your Mod: Difference between revisions
(Исправлены ошибки + переведены некоторые спорные части.) |
m (Setting bug notice hidetested=1 param on page where the bug might not need tested in param specified) |
||
| (60 intermediate revisions by 4 users not shown) | |||
| Line 1: | Line 1: | ||
{{LanguageBar|title = Добавление PBR в ваш мод}} | |||
Цель этой статьи - показать вам, как реализовать [https://github.com/thexa4/source-pbr Thexa4's PBR шейдер] в вашем | {{warning | ||
|text = ''Этот шейдер не работает с LightMapped брашами, однако технически он совместим с ними.'' | |||
{{code fix|text = В {{Path|src/utils/common/utilmatlib|cpp|icon=file}} найдите метод {{code|InitMaterialSystem}} и в самом конце добавьте {{code|g_pMaterialSystem->ModInit();}}, и попробуйте пересобрать инструменты. ''}} | |||
{{note| В некоторых сторонних версиях {{L|VBSP}} эта проблема исправлена. Например в {{strata|2}}, {{mapbase|2}} & {{slamminsrc|2}}.}} | |||
}} | |||
[[File:PBR comparison.png|420px|thumb|right|<center>'''Сравнение PBR'''</center><br> Слева: Базовый шейдер Source Engine.<br> Справа: PBR шейдер.]] | |||
{{distinguish|Adapting PBR Textures to Source}} | |||
Цель этой статьи - показать вам, как реализовать [https://github.com/thexa4/source-pbr Thexa4's PBR шейдер] в вашем {{src13|4}} моде. Реализация этого шейдера позволит вам использовать metalness/roughness PBR поверхности в материалах. | |||
== Вступление == | == Вступление == | ||
| Line 15: | Line 26: | ||
{{note|Если вы не знаете, как компилировать шейдеры, или еще не работали с шейдерами в | {{note|Если вы не знаете, как компилировать шейдеры, или еще не работали с шейдерами в {{src|4}}, рекомендуется сначала прочитать эти статьи: {{L|Shader Authoring|Разработка шейдеров}} & {{L|Source_SDK_2013:_Your_First_Shader|Ваш первый шейдер}}}} | ||
== Реализация == | == Реализация == | ||
| Line 22: | Line 33: | ||
Вы можете сделать это | Вы можете сделать это перейдя по ссылкам ниже, нажмите кнопку "Raw" и как только страница загрузится кликните правой кнопкой мыши и выберите "Save As...". | ||
Все что от вас требуется, это сохранить эти файлы в директорию с исходным кодом вашего мода в {{Path|src/materialsystem/stdshaders/}}. | |||
* [https://github.com/thexa4/source-pbr/blob/feature/pbr-base/mp/src/materialsystem/stdshaders/pbr_dx9.cpp pbr_dx9.cpp] | * [https://github.com/thexa4/source-pbr/blob/feature/pbr-base/mp/src/materialsystem/stdshaders/pbr_dx9.cpp pbr_dx9.cpp] | ||
| Line 33: | Line 44: | ||
* [https://github.com/thexa4/source-pbr/blob/feature/pbr-base/mp/src/materialsystem/stdshaders/pbr_common_ps2_3_x.h pbr_common_ps2_3_x.h] | * [https://github.com/thexa4/source-pbr/blob/feature/pbr-base/mp/src/materialsystem/stdshaders/pbr_common_ps2_3_x.h pbr_common_ps2_3_x.h] | ||
После того как вы завершите сохранение файлов, откройте | |||
< | После того как вы завершите сохранение файлов, откройте {{Path|src/materialsystem/stdshaders/game_shader_dx9_*|vpc|icon=file}} в соответствии с базированием вашего мода (base/hl2mp/hl2/episodic), и добавьте файлы PBR внутрь {{Code|select=all|$Project "Shaders"}} вот так: | ||
$Project "Shaders" | {{CodeBlock|lines=33|<nowiki>$Project "Shaders" | ||
{ | { | ||
$Folder "Header Files" | $Folder "Header Files" | ||
| Line 67: | Line 78: | ||
$File "pbr_dx9.cpp" | $File "pbr_dx9.cpp" | ||
} | } | ||
} | }</nowiki>}} | ||
</ | |||
Мы делаем это для того, чтобы когда мы обновим решение, файлы появились в обозревателе решений. | |||
=== Компиляция шейдеров === | === Компиляция шейдеров === | ||
Нам нужно скомпилировать шейдеры перед их | Нам нужно скомпилировать шейдеры перед их использованием. Создайте 2 файла в {{Path|src/materialsystem/stdshaders/}} с именем {{Code|select=all|mymod_dx9_30.txt}} и {{Code|select=all|mymod_dx9_20b.txt}}, и вставьте это внутрь: | ||
= | {{CodeBlock|lines=11|src=mymod_dx9_30.txt|<nowiki>// | ||
< | |||
// | |||
// vs 3.0 ps 3.0 shaders collection | // vs 3.0 ps 3.0 shaders collection | ||
// | // | ||
| Line 87: | Line 96: | ||
pbr_vs30.fxc | pbr_vs30.fxc | ||
pbr_ps30.fxc | pbr_ps30.fxc</nowiki>}} | ||
</ | |||
= | {{CodeBlock|lines=11|src=mymod_dx9_20b.txt|<nowiki>// | ||
< | |||
// | |||
// Standard shaders collection | // Standard shaders collection | ||
// | // | ||
| Line 102: | Line 108: | ||
pbr_vs20b.fxc | pbr_vs20b.fxc | ||
pbr_ps20b.fxc | pbr_ps20b.fxc</nowiki>}} | ||
</ | |||
Добавление этих новых текстовых файлов для компиляции шейдера, позволит вам скомпилировать PBR шейдер без влияния на стандартные {{Shader_Name|LightmappedGeneric}} шейдеры. | |||
Это также значительно сократит время компиляции. | |||
Теперь откройте {{Path|buildsdkshaders|bat|icon=file}} используя текстовый редактор и измените эту часть: | |||
C: | |||
{{CodeBlock|%BUILD_SHADER% stdshader_dx9_20b -game %GAMEDIR% -source %SOURCEDIR% | |||
%BUILD_SHADER% stdshader_dx9_30 -game %GAMEDIR% -source %SOURCEDIR% -dx9_30 -force30}} | |||
На: | |||
{{CodeBlock|%BUILD_SHADER% mymod_dx9_20b -game %GAMEDIR% -source %SOURCEDIR% | |||
%BUILD_SHADER% mymod_dx9_30 -game %GAMEDIR% -source %SOURCEDIR% -dx9_30 -force30}} | |||
Это позволит вам использовать наши текстовые файлы, которые мы создали ранее, чтобы скомпилировать наш PBR шейдер. | |||
{{ModernImportant|Если вы используете Visual Studio 2013 не забудьте поменять версию инстурментов в {{Path|buildsdkshaders|bat|icon=file}} | |||
C: | |||
{{CodeBlock|call "%VS100COMNTOOLS%vsvars32.bat"}} | |||
{{ | На: | ||
{{CodeBlock|call "%VS120COMNTOOLS%vsvars32.bat"}} | |||
}} | |||
После этого, мы можем начать компиляцию нашего шейдера запустив {{Path|buildhl2mpshaders|bat|icon=file}}, {{Path|buildhl2shaders|bat|icon=file}} или {{Path|buildepisodicshaders|bat|icon=file}} в зависимости от того, на чем базируется ваш мод. | |||
Убедитесь что следовали статье {{L|Shader Authoring|Разработка шейдеров}} до того момента, когда вновь скомпилированные шейдеры будут правильно помещены в папку вашего мода {{Path|shaders/fxc/}}. | |||
{{note|В зависимости от вашего ПК и сложности шейдера, это может занять некоторое время.}} | |||
Под < | Если шейдеры скомпилировались без проблем, вернитесь назад в вашу директорию с исходым кодом {{Path|src/}} и запустите {{Path|createallprojects|bat|icon=file}}. | ||
Откройте решение и скомпилируйте шейдеры в {{Code|Release}}. | |||
{{note|Если {{Path|pbr_dx9|cpp}} нету в {{Code|Shader}} проекте. Убедитесь, что вы правильно подключили его в {{Code|.vpc}} файле который вы редактировали ранее.}} | |||
== Исправления == | |||
Физические пропы становятся черными, если используют материал с PBR шейдером, после 2-3 секунд из-за Prop Sleeping. После указанного времени, пропы "запекают" свой свет для оптимизации. | |||
Вы можете обойти это написав {{code|select=all|r_PhysPropStaticLighting 0}} в консоли или прописать в {{Path|src/game/client/c_physicsprop|cpp|icon=file}}. | |||
Вот, как вы можете прописать это в коде: | |||
Под {{code|select=all|<nowiki>#include "tier0/memdbgon.h"</nowiki>}} добавьте это: | |||
<source lang="cpp"> | <source lang="cpp"> | ||
#define PBR_CHANGE | #define PBR_CHANGE | ||
</source> | </source> | ||
Затем найдите {{code|select=all|ConVar r_PhysPropStaticLighting("r_PhysPropStaticLighting", "1");}} и замените его данным условием: | |||
<source lang="cpp"> | <source lang="cpp"> | ||
#ifdef PBR_CHANGE | #ifdef PBR_CHANGE | ||
| Line 159: | Line 177: | ||
#endif | #endif | ||
</source> | </source> | ||
== Параметры == | == Параметры == | ||
* '''$ | * {{ent|$basetexture}} - Albedo текстура. | ||
* '''$ | * '''$normaltexture''' - карта нормалей (для обратной совместимости). | ||
* '''$ | * {{ent|$bumpmap}} - карта нормалей (новый вариант указания карты нормалей). | ||
* '''$mraotexture''' - Текстура с metalness на красном канале, roughness на зеленом канале и ambient occlusion на синем канале. | |||
* '''$speculartexture''' - Включает использование цветной F0 (карты отражений), перезаписывая текстуру с metalness из MRAO текстуры. | |||
* '''$emissiontexture''' - Позволяет установить текстуру c emission. Включает [[Glowing_Textures#$selfillum|self illumination | |||
.]] | |||
* '''$useenvambient''' <{{ent|boolean}}> - Позволяет использовать самый низкий уровень mip карт кубмапов для окружающего освещения вместо кубов окружения. Может вызывать артефакты при перемещении пропов. | |||
* {{ent|$envmap}} - По умолчанию <code>"env_cubemap"</code>, но также позволяет исвользовать свой вариант. | |||
* {{ent|$surfaceprop}} - Связывает поверхность {{L|Material|материала}} или {{L|model|модели}} с набором физических свойств. | |||
*<code>{{L|$model (VMT)|$model}}</code> - Должно иметь значение "1" если материал используется для пропа. | |||
* {{ent|$translucent}} - Установка данного параметра на "1" включает Alpha-смешивание. | |||
* {{ent|$basetexturetransform}} - Выглядит так: "center 0.5 0.5 scale 0.1025 0.1025 rotate 0 translate 0 0" для 2m на 2m текстуры. | |||
* {{ent|$alphatest}} - Позволяет обрезать пиксели, когда альфа-значение опускается ниже {{L|$alphatest#Доп._параметры|$alphatestreference.}} | |||
* {{L|$alphatest#Доп._параметры|$alphatestreference}} - Задаёт минимальное значение цвета альфа-канала, в котором эффект округляется до 255. Значение «.3» создаст более толстую форму, а значение «.7» создаст более тонкую форму. | |||
* {{ent|%keywords}} - Список ключевых слов разделенных запятыми. Примеры ключевых слов: architectural,brown,gray,grime,hanger,industrial,metal,modern,shed,urban,wall,floor | |||
* $useparallax <{{ent|boolean}}> - Использовать Parallax Occlusion Mapping. | |||
* $parallaxdepth <{{ent|float}}> - Гулибна Parallax карты. | |||
* $parallaxcenter <{{ent|float}}> - Средняя глубина Parallax карты | |||
{{note|$emissiontexture - текcтура содержит цвет, это не маска.}} | |||
{{ | {{bug|hidetested=1|По умолчанию, все тени направлены относительно игрока, как если бы он держал источник света у себя в руках, а не использовал внешние.}} | ||
== Примеры == | == Примеры == | ||
=== Браш (не модельные поверхности), образец материала === | === Браш (не модельные поверхности), образец материала === | ||
< | {{CodeBlock|lines=10|<nowiki>PBR | ||
PBR | |||
{ | { | ||
$basetexture "pbr_asset/texture_albedo" | $basetexture "pbr_asset/texture_albedo" | ||
| Line 199: | Line 217: | ||
$surfaceprop "metal" | $surfaceprop "metal" | ||
$model 0 | $model 0 | ||
} | }</nowiki>}} | ||
</ | |||
=== Модель, образец материала === | === Модель, образец материала === | ||
< | {{CodeBlock|lines=10|<nowiki>PBR | ||
PBR | |||
{ | { | ||
$basetexture "models/pbr_asset/texture_albedo" | $basetexture "models/pbr_asset/texture_albedo" | ||
| Line 213: | Line 229: | ||
$surfaceprop "metal" | $surfaceprop "metal" | ||
$model 1 | $model 1 | ||
} | }</nowiki>}} | ||
</ | |||
=== Модель, образец материала с картой отражений === | === Модель, образец материала с картой отражений === | ||
{{Note|Metalness | {{Note|Канал Metalness игнорируется и {{Shader_Name|$basetexture|type=param}} обрабатывается как diffuse.}} | ||
< | {{CodeBlock|lines=11|<nowiki>PBR | ||
PBR | |||
{ | { | ||
$basetexture "models/pbr_asset/texture_diffuse" | $basetexture "models/pbr_asset/texture_diffuse" | ||
| Line 230: | Line 244: | ||
$model 1 | $model 1 | ||
} | } | ||
</ | </nowiki>}} | ||
{{note| | {{note|В {{Shader_Name|$envmap|type=param}} следует оставить<code>"env_cubemap".</code>}} | ||
{{warning| | {{warning|Для работы материалов моделей, с использованием PBR, {{Shader_Name|{{L|$model_(VMT)|$model 1}}|type=param}} '''''ДОЛЖЕН''''' быть добавлен в материал!}} | ||
== Вывод == | == Вывод == | ||
Вот и все! Теперь в вашем моде есть PBR. | |||
{{ACategory|Modding}} | |||
{{ACategory|Tutorials}} | |||
{{ACategory|Shaders}} | |||
[[ | ==See also== | ||
*[[PBR (shader)]] | |||
{{ACategory|Modding}} | |||
{{ACategory|Tutorials}} | |||
{{ACategory|PBR}} | |||
Latest revision as of 06:18, 20 May 2025
src/utils/common/utilmatlib.cpp найдите метод InitMaterialSystem и в самом конце добавьте g_pMaterialSystem->ModInit();, и попробуйте пересобрать инструменты.
Цель этой статьи - показать вам, как реализовать Thexa4's PBR шейдер в вашем
Source 2013 моде. Реализация этого шейдера позволит вам использовать metalness/roughness PBR поверхности в материалах.
Вступление
Требования
- Умение компилировать шейдеры.
- Умение компилировать решения.
Реализация
Прежде чем делать что-то, нам нужно скачать файлы.
Вы можете сделать это перейдя по ссылкам ниже, нажмите кнопку "Raw" и как только страница загрузится кликните правой кнопкой мыши и выберите "Save As...".
Все что от вас требуется, это сохранить эти файлы в директорию с исходным кодом вашего мода в ![]()
src/materialsystem/stdshaders/.
После того как вы завершите сохранение файлов, откройте ![]()
src/materialsystem/stdshaders/game_shader_dx9_*.vpc в соответствии с базированием вашего мода (base/hl2mp/hl2/episodic), и добавьте файлы PBR внутрь $Project "Shaders" вот так:
Мы делаем это для того, чтобы когда мы обновим решение, файлы появились в обозревателе решений.
Компиляция шейдеров
Нам нужно скомпилировать шейдеры перед их использованием. Создайте 2 файла в ![]()
src/materialsystem/stdshaders/ с именем mymod_dx9_30.txt и mymod_dx9_20b.txt, и вставьте это внутрь:
Добавление этих новых текстовых файлов для компиляции шейдера, позволит вам скомпилировать PBR шейдер без влияния на стандартные
LightmappedGeneric шейдеры.
Это также значительно сократит время компиляции.
Теперь откройте ![]()
buildsdkshaders.bat используя текстовый редактор и измените эту часть:
C:
На:
Это позволит вам использовать наши текстовые файлы, которые мы создали ранее, чтобы скомпилировать наш PBR шейдер.
buildsdkshaders.bat
C:
На:
После этого, мы можем начать компиляцию нашего шейдера запустив ![]()
buildhl2mpshaders.bat, ![]()
buildhl2shaders.bat или ![]()
buildepisodicshaders.bat в зависимости от того, на чем базируется ваш мод.
Убедитесь что следовали статье Разработка шейдеров до того момента, когда вновь скомпилированные шейдеры будут правильно помещены в папку вашего мода ![]()
shaders/fxc/.
Если шейдеры скомпилировались без проблем, вернитесь назад в вашу директорию с исходым кодом ![]()
src/ и запустите ![]()
createallprojects.bat.
Откройте решение и скомпилируйте шейдеры в Release.
pbr_dx9.cpp нету в Shader проекте. Убедитесь, что вы правильно подключили его в .vpc файле который вы редактировали ранее.
Исправления
Физические пропы становятся черными, если используют материал с PBR шейдером, после 2-3 секунд из-за Prop Sleeping. После указанного времени, пропы "запекают" свой свет для оптимизации.
Вы можете обойти это написав r_PhysPropStaticLighting 0 в консоли или прописать в ![]()
src/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 карты
Примеры
Браш (не модельные поверхности), образец материала
Модель, образец материала
Модель, образец материала с картой отражений
$basetexture обрабатывается как diffuse.
$envmap следует оставить"env_cubemap".$model 1 ДОЛЖЕН быть добавлен в материал!Вывод
Вот и все! Теперь в вашем моде есть PBR.