|
Top > エンジン改造-ShadingModel拡張
UE4.15.1で検証
参考 †
メモ †
- MSM_MAX(SHADINGMODELID_MASK)は最大16。
シェーダー内で0xf(SHADINGMODELID_MASK)でマスクしている。
他の変数と合わせて、8bit使用。
その8bitをGバッファの1変数に書き込んでいるのでMSM_MAXは16が限界。
やってみた †
- Engine\Source\Runtime\Engine\Classes\Engine\EngineTypes.h
| MSM_Eye UMETA(DisplayName="Eye"),
|
の下に追加する。
| MSM_Cell UMETA(DisplayName = "Cell"),
|
- Engine\Source\Runtime\Engine\Private\Materials\MaterialShader.cpp
- FString GetShadingModelString(...)
| case MSM_Eye: ShadingModelName = TEXT("MSM_Eye"); break;
|
の下に追加する。
| case MSM_Cell: ShadingModelName = TEXT("MSM_Cell"); break;
|
- void UpdateMaterialShaderCompilingStats(...)
| case MSM_TwoSidedFoliage:
|
の下に追加する
- Engine\Source\Runtime\Engine\Private\Materials\MaterialShared.cpp
- void FMaterial::SetupMaterialEnvironment(...)
| case MSM_Eye: OutEnvironment.SetDefine(TEXT("MATERIAL_SHADINGMODEL_EYE"), TEXT("1")); break;
|
の下に追加分。シェーダー内でdefine定義される。
| case MSM_Cell: OutEnvironment.SetDefine(TEXT("MATERIAL_SHADINGMODEL_CELL"), TEXT("1")); break;
|
- Engine\Shaders\DeferredShadingCommon.usf
- #define SHADINGMODELID_*
| #define SHADINGMODELID_EYE 9
|
の下に追加。MSM_*と一致させる。
| #define SHADINGMODELID_CELL 10
|
SHADINGMODELID_NUMも合わせて数値を更新する
- Engine\Shaders\BasePassPixelShader.usf
- FPixelShaderInOut_MainPS
| #elif MATERIAL_SHADINGMODEL_EYE
|
の下に新規作成したShading Model IDを繋げてGバッファへの出力を書いていく
- Engine\Shaders\ShadingModels.usf
- SurfaceShading
| switch( GBuffer.ShadingModelID )
|
に新しいShading Modelを追加
| case SHADINGMODELID_CELL:
return CellShading( GBuffer.DiffuseColor, GBuffer.SpecularColor, GBuffer.CellD, LobeRoughness, LobeEnergy, L, V, N );
|
- シェーディングを独自にする。
- Engine\Shaders\DeferredShadingCommon.usf
でSurfaceShadingでシェーディング計算、LightAccumulator_Addで結果を加算したりする
|