#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 #code(C,nonumber,nomenu){{ MSM_Eye UMETA(DisplayName="Eye"), }} の下に追加する。 #code(C,nonumber,nomenu){{ MSM_Cell UMETA(DisplayName = "Cell"), }} + Engine\Source\Runtime\Engine\Private\Materials\MaterialShader.cpp ++ FString GetShadingModelString(...) #code(C,nonumber,nomenu){{ case MSM_Eye: ShadingModelName = TEXT("MSM_Eye"); break; }} の下に追加する。 #code(C,nonumber,nomenu){{ case MSM_Cell: ShadingModelName = TEXT("MSM_Cell"); break; }} ++ void UpdateMaterialShaderCompilingStats(...) #code(C,nonumber,nomenu){{ case MSM_TwoSidedFoliage: }} の下に追加する #code(C,nonumber,nomenu){{ case MSM_Cell: }} + Engine\Source\Runtime\Engine\Private\Materials\MaterialShared.cpp ++ void FMaterial::SetupMaterialEnvironment(...) #code(C,nonumber,nomenu){{ case MSM_Eye: OutEnvironment.SetDefine(TEXT("MATERIAL_SHADINGMODEL_EYE"), TEXT("1")); break; }} の下に追加分。シェーダー内でdefine定義される。 #code(C,nonumber,nomenu){{ case MSM_Cell: OutEnvironment.SetDefine(TEXT("MATERIAL_SHADINGMODEL_CELL"), TEXT("1")); break; }} + Engine\Shaders\DeferredShadingCommon.usf ++ #define SHADINGMODELID_* #code(C,nonumber,nomenu){{ #define SHADINGMODELID_EYE 9 }} の下に追加。MSM_*と一致させる。 #code(C,nonumber,nomenu){{ #define SHADINGMODELID_CELL 10 }} SHADINGMODELID_NUMも合わせて数値を更新する + Engine\Shaders\BasePassPixelShader.usf ++ FPixelShaderInOut_MainPS #code(C,nonumber,nomenu){{ #elif MATERIAL_SHADINGMODEL_EYE }} の下に新規作成したShading Model IDを繋げてGバッファへの出力を書いていく + Engine\Shaders\ShadingModels.usf ++ SurfaceShading #code(C,nonumber,nomenu){{ switch( GBuffer.ShadingModelID ) }} に新しいShading Modelを追加 #code(C,nonumber,nomenu){{ case SHADINGMODELID_CELL: return CellShading( GBuffer.DiffuseColor, GBuffer.SpecularColor, GBuffer.CellD, LobeRoughness, LobeEnergy, L, V, N ); }} + シェーディングを独自にする。 ++ Engine\Shaders\DeferredShadingCommon.usf #code(C,nonumber,nomenu){{ GetDynamicLighting }} でSurfaceShadingでシェーディング計算、LightAccumulator_Addで結果を加算したりする |