Ru/Adding PBR to Your Mod: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
m (Added langsp)
m (Formatting update)
Line 1: Line 1:
{{langsp|title=Добавление PBR в ваш мод}}
{{langsp|title=Добавление PBR в ваш мод}}
{{messagebox
|text = ''Этот шейдер не работает с LightMapped брашами, однако технически он совместим с ними.''
|image = [[File:Warning_icon.png|55px]]
|bdcolor = #d31b1b
}}


[[File:PBR_comparison.png|500px|thumb|right|Слева: Базовый шейдер Source Engine.<br> Справа: PBR шейдер.]]
[[File:PBR_comparison.png|500px|thumb|right|Слева: Базовый шейдер Source Engine.<br> Справа: PBR шейдер.]]


{{distinguish:ru|Adapting PBR Textures to Source}}
{{distinguish|Adapting PBR Textures to Source}}


Цель этой статьи - показать вам, как реализовать [https://github.com/thexa4/source-pbr Thexa4's PBR шейдер] в вашем Source SDK 2013 моде. Реализация этого шейдера позволит вам использовать metalness/roughness PBR поверхности в материалах.
Цель этой статьи - показать вам, как реализовать [https://github.com/thexa4/source-pbr Thexa4's PBR шейдер] в вашем Source SDK 2013 моде. Реализация этого шейдера позволит вам использовать metalness/roughness PBR поверхности в материалах.
Line 10: Line 16:
== Вступление ==
== Вступление ==


{{main:ru|Physically Based Rendering}} {{en}}
{{main|Physically Based Rendering}} {{en}}


== Требования ==
== Требования ==
Line 18: Line 24:




{{note:ru|Если вы не знаете, как компилировать шейдеры, или еще не работали с шейдерами в Source Engine, рекомендуется сначала прочитать эти статьи: [[Shader Authoring:ru|Разработка шейдеров]] & [[Source_SDK_2013:_Your_First_Shader|Ваш первый шейдер]] {{en}}}}
{{note|Если вы не знаете, как компилировать шейдеры, или еще не работали с шейдерами в Source Engine, рекомендуется сначала прочитать эти статьи: [[Shader Authoring:ru|Разработка шейдеров]] & [[Source_SDK_2013:_Your_First_Shader|Ваш первый шейдер]] {{en}}}}


== Реализация ==  
== Реализация ==  
Line 151: Line 157:
Убедитесь что следовали статье [[Shader Authoring:ru|Разработка шейдеров]] до того момента, когда вновь скомпилированные шейдеры будут правильно помещены в папку вашего мода '''shaders/fxc/'''.
Убедитесь что следовали статье [[Shader Authoring:ru|Разработка шейдеров]] до того момента, когда вновь скомпилированные шейдеры будут правильно помещены в папку вашего мода '''shaders/fxc/'''.


{{note:ru|В зависимости от вашего ПК и сложности шейдера, это может занять некоторое время.}}
{{note|В зависимости от вашего ПК и сложности шейдера, это может занять некоторое время.}}




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


{{note:ru|Если '''pbr_dx9.cpp''' нету в '''Shader''' проекте. Убедитесь, что вы правильно подключили его в '''.vpc''' файле который вы редактировали ранее.}}
{{note|Если '''pbr_dx9.cpp''' нету в '''Shader''' проекте. Убедитесь, что вы правильно подключили его в '''.vpc''' файле который вы редактировали ранее.}}


== Исправления ==
== Исправления ==
Line 207: Line 213:




{{note:ru|$emissiontexture - текcтура содержит цвет, это не маска.}}
{{note|$emissiontexture - текcтура содержит цвет, это не маска.}}


{{bug:ru|По умолчанию, все тени направлены относительно игрока, как если бы он держал источник света у себя в руках, а не использовал внешние.}}
{{bug|По умолчанию, все тени направлены относительно игрока, как если бы он держал источник света у себя в руках, а не использовал внешние.}}




Line 242: Line 248:


=== Модель, образец материала с картой отражений ===
=== Модель, образец материала с картой отражений ===
{{Note:ru|Канал Metalness игнорируется и {{ent:ru|$basetexture}} обрабатывается как diffuse.}}
{{Note|Канал Metalness игнорируется и {{ent:ru|$basetexture}} обрабатывается как diffuse.}}
<pre>
<pre>
PBR
PBR
Line 258: Line 264:




{{note:ru|В {{ent|$envmap}} {{en}} следует оставить<code>"env_cubemap".</code>}}
{{note|В {{ent|$envmap}} {{en}} следует оставить<code>"env_cubemap".</code>}}


{{warning:ru|Для работы материалов моделей, с использованием PBR, <code>[[$model_(VMT)|$model 1]]</code>{{en}} '''''ДОЛЖЕН'''''  быть добавлен в материал!}}
{{warning|Для работы материалов моделей, с использованием PBR, <code>[[$model_(VMT)|$model 1]]</code>{{en}} '''''ДОЛЖЕН'''''  быть добавлен в материал!}}


== Вывод ==
== Вывод ==

Revision as of 14:44, 12 July 2023

English (en)Русский (ru)Translate (Translate)
Слева: Базовый шейдер Source Engine.
Справа: PBR шейдер.
Не следует путать с Adapting PBR Textures to Source.

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


Вступление

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

English

Требования

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


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

Реализация

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


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

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

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

$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

//
// 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

//
// 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 шейдер без влияния на стандартные LightmappedGeneric English шейдеры.

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



Теперь откройте buildsdkshaders.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 шейдер.


Template:Important:ru

C:

call "%VS100COMNTOOLS%vsvars32.bat"

На:

call "%VS120COMNTOOLS%vsvars32.bat"


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

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

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


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


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

Note.pngПримечание:Если 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 English - карта нормалей (новый вариант указания карты нормалей).
  • $mraotexture - Текстура с metalness на красном канале, roughness на зеленом канале и ambient occlusion на синем канале.
  • $speculartexture - Включает использование цветной F0 (карты отражений), перезаписывая текстуру с metalness из MRAO текстуры.
  • $emissiontexture - Позволяет установить текстуру c emission. Включает self illumination . English
  • $useenvambient <bool> - Позволяет использовать самый низкий уровень mip карт кубмапов для окружающего освещения вместо кубов окружения. Может вызывать артефакты при перемещении пропов.
  • $envmap English - По умолчанию "env_cubemap", но также позволяет исвользовать свой вариант.
  • $surfaceprop - Связывает поверхность материала или модели с набором физических свойств.
  • $modelEnglish - Должно иметь значение "1" если материал используется для пропа.
  • $translucent English - Установка данного параметра на "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 English - Список ключевых слов разделенных запятыми. Примеры ключевых слов: architectural,brown,gray,grime,hanger,industrial,metal,modern,shed,urban,wall,floor


  • $useparallax <bool> - Использовать Parallax Occlusion Mapping.
  • $parallaxdepth <float> - Гулибна Parallax карты.
  • $parallaxcenter <float> - Средняя глубина Parallax карты


Note.pngПримечание:$emissiontexture - текcтура содержит цвет, это не маска.
Icon-Bug.pngБаг:По умолчанию, все тени направлены относительно игрока, как если бы он держал источник света у себя в руках, а не использовал внешние.  [нужно проверить в ?]


Примеры

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

PBR
{
        $basetexture      "pbr_asset/texture_albedo"
        $bumpmap          "pbr_asset/texture_normal"
        $mraotexture      "pbr_asset/texture_mrao"

        $envmap           "env_cubemap"
        $surfaceprop      "metal"
        $model            0
}

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

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 игнорируется и $basetexture обрабатывается как diffuse.
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Примечание:В $envmap English следует оставить"env_cubemap".
Warning.pngПредупреждение:Для работы материалов моделей, с использованием PBR, $model 1English ДОЛЖЕН быть добавлен в материал!

Вывод

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