Adding PBR to your mod:ru

From Valve Developer Community
Jump to: navigation, search
 English Русский 
Слева: Базовый шейдер Source Engine.
Справа: PBR шейдер.
Не путать с Adapting PBR Textures to Source.

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


Вступление

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

Требования

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


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

Реализация

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


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

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



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


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


C:

call "%VS100COMNTOOLS%vsvars32.bat"

На:

call "%VS120COMNTOOLS%vsvars32.bat"


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

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

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


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


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

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

Исправления

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


Note.png Примечание: $emissiontexture - цветная тектура, не маска.
Bug.png Баг: By default all shadows appear to point towards the user as if the user is holding a light, instead of using exterior light sources.

Примеры

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

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 channel is ignored and $basetexture is treated as 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 should just be left as env_cubemap.
Warning.png Предупреждение: $model 1 MUST be added for models to work!

Вывод

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