#contents ---- * 参考 [#j6c919a8] - [UE4] 拡張したGBufferを使って異方性スペキュラをやってみる - もんしょの巣穴 http://monsho.blog63.fc2.com/blog-entry-192.html * メモ [#s7cb3fef] - MSM_MAX(SHADINGMODELID_MASK)は最大16。 シェーダー内で0xf(SHADINGMODELID_MASK)でマスクしている。 他の変数と合わせて、8bit使用。 その8bitをGバッファの1変数に書き込んでいるのでMSM_MAXは16が限界。 * やってみた [#ff88f001] + 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: の下に追加する case MSM_Cell: + 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 GetDynamicLighting でSurfaceShadingでシェーディング計算、LightAccumulator_Addで結果を加算したりする |