Ru/Adding PBR to Your Mod: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
m (Undo revision 239815 by Soyka (talk))
Tag: Undo
mNo edit summary
Line 1: Line 1:
<noinclude>{{lang|Adding_PBR_to_your_mod:Bug}}</noinclude>
{{otherlang2
| title = Добавление PBR в ваш мод
| us = Adding_PBR_to_your_mod
}}
[[File:PBR_comparison.png|500px|thumb|right|Слева: Базовый шейдер Source Engine.<br> Справа: PBR шейдер.]]
[[File:PBR_comparison.png|500px|thumb|right|Слева: Базовый шейдер Source Engine.<br> Справа: PBR шейдер.]]



Revision as of 11:05, 6 March 2021

Template:Otherlang2

Слева: Базовый шейдер Source Engine.
Справа: PBR шейдер.
Не путать с Adapting PBR Textures to Source.

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

Вступление

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

Требования

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


Template:Note:ru

Реализация

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


Вы можете сделать это перейдя по ссылкам ниже, нажмите кнопку "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 шейдеры.

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


important:ru


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


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

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

Template:Note:ru


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


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

Template:Note:ru

Исправления

Physics props turn black when used with the PBR shader after 2-3 seconds due to Prop Sleeping. After a set time, props "bake" their lighting for optimization.

You can bypass this by typing r_PhysPropStaticLighting 0 on the console or by hardcoding it in src/game/client/c_physicsprop.cpp.


Here is how you can hardcode it:

Под #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 - Sets the normal map (for backwards compatibility).
  • $bumpmap - Sets the normal map (new way of setting normalmap).
  • $mraotexture - Текстура с metalness на красном канале, roughness на зеленом канале и ambient occlusion на синем канале.
  • $speculartexture - Enables use of colored F0 (specular map), overrides metalness from MRAO texture.
  • $emissiontexture - Allows setting an emission texture. Enabled self illumination.
  • $useenvambient <bool> - Makes it use the lowest mip level of the cubemap for ambient light instead of the ambient cubes. Can cause artifacts with moving props.
  • $envmap - Defaults to "env_cubemap", allows you to use a custom one.
  • $surfaceprop - Links the surface of either a material or model to a set of physical properties.
  • $model - Should have a value of "1" if the texture is used on a prop.
  • $translucent - Setting this to "1" enables alpha blending.
  • $basetexturetransform - Looks like this: "center 0.5 0.5 scale 0.1025 0.1025 rotate 0 translate 0 0" for a 2m by 2m texture.
  • $alphatest - Enables clipping the pixel when the alpha goes below $alphatestreference.
  • $alphatestreference - Specifies the minimum color value of the alpha channel in which the effect is rounded to 255. A value of ".3" will create a thicker shape while a value of ".7" will create a thinner shape.
  • %keywords - A list of keywords separated by commas. Examples of keywords are: architectural,brown,gray,grime,hanger,industrial,metal,modern,shed,urban,wall,floor


  • $useparallax <bool> - Use Parallax Occlusion Mapping.
  • $parallaxdepth <float> - Depth of the Parallax Map
  • $parallaxcenter <float> - Center depth of the Parallax Map


Template:Note:ru

Template:Bug:ru

Примеры

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

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
}

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

Template:Note:ru

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
}


Template:Note:ru

Template:Warning:ru

Вывод

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