#contents

----
UE4.15.1で検証

* 参考 [#vd9b40e9]
- [UE4] GBufferを拡張せずに異方性スペキュラをやってみる - もんしょの巣穴blog
http://monsho.blog63.fc2.com/blog-entry-193.html

- UE4でマテリアル出力にピンを追加(UE4.14.0) - Qiita
http://qiita.com/com04/items/6dc75c647ce97ba72ba4

* メモ [#q58a0421]
- EMaterialProperty - MP_MAXは33が限界。Uint32でビットマスクにして使っている。

* やってみた [#a1051e1c]
+ Engine\Source\Runtime\Engine\Public\SceneTypes.h
++ enum EMaterialProperty
#code(C,nonumber,nomenu){{
 MP_PixelDepthOffset,
}}
の下に追加分
+ Engine\Source\Runtime\Engine\Classes\Materials\Material.h
#code(C,nonumber,nomenu){{
 FScalarMaterialInput PixelDepthOffset;
}}
の下に追加するパラメーターの変数を追加する
#code(C,nonumber,nomenu){{
 UPROPERTY()
 FScalarMaterialInput CellShadeParam;
}}
-- FScalarMaterialInput
-- FVector2MaterialInput
-- FVectorMaterialInput
+ Engine\Source\Runtime\Engine\Private\Materials\Material.cpp
++ void UMaterial::Serialize(...)
#code(C,nonumber,nomenu){{
 static_assert(MP_MAX == 29,
}}
を追加した分のMP_MAX値にする
#code(C,nonumber,nomenu){{
 static_assert(MP_MAX == 33, 
}}
++ UMaterial::PostLoad()
#code(C,nonumber,nomenu){{
 DoMaterialAttributeReorder(&PixelDepthOffset, UE4Ver);
}}
の下に追加分
#code(C,nonumber,nomenu){{
 DoMaterialAttributeReorder(&CellShadeParam, UE4Ver);
}}
++ FExpressionInput* UMaterial::GetExpressionInputForProperty(...)
#code(C,nonumber,nomenu){{
 case MP_PixelDepthOffset:		return &PixelDepthOffset;
}}
の下に追加分
#code(C,nonumber,nomenu){{
 case MP_CellShadeParam:			return &CellShadeParam;
}}
++ UMaterial::CompilePropertyEx
#code(C,nonumber,nomenu){{
 case MP_PixelDepthOffset:		return PixelDepthOffset.CompileWithDefault(Compiler, Property);
}}
の下に追加分
#code(C,nonumber,nomenu){{
 case MP_CellShadeParam:			return CellShadeParam.CompileWithDefault(Compiler, Property);
}}
++ bool UMaterial::IsPropertyActive(EMaterialProperty InProperty) const 
#code(C,nonumber,nomenu){{
 case MP_PixelDepthOffset:
 	Active = !bIsTranslucentBlendMode;
 	break;
}}
の下に追加。このピンを使用するShadingModelを記述する。
#code(C,nonumber,nomenu){{
 case MP_CellShadeParam:
 	Active = ShadingModel == MSM_Cell || ShadingModel == MSM_CellSaturation || ShadingModel == MSM_CellEye || ShadingModel == MSM_CellHair || ShadingModel == MSM_CellHairSaturation || ShadingModel == MSM_CellOutline;
 	break;
}}
+ Engine\Source\Runtime\Engine\Private\Materials\MaterialExpressions.cpp
++ int32 UMaterialExpressionMakeMaterialAttributes::Compile(...)
++ UMaterialExpressionBreakMaterialAttributes::UMaterialExpressionBreakMaterialAttributes(...)
#code(C,nonumber,nomenu){{
 static_assert(MP_MAX == 29,
}}
を追加した分のMP_MAX値にする
#code(C,nonumber,nomenu){{
 static_assert(MP_MAX == 33,
}}
++ UMaterialExpressionBreakMaterialAttributes::UMaterialExpressionBreakMaterialAttributes
#code(C,nonumber,nomenu){{
 Outputs.Add(FExpressionOutput(TEXT("PixelDepthOffset"), 1, 1, 1, 1, 0));
}}
の下に追加分。
#code(C,nonumber,nomenu){{
 Outputs.Add(FExpressionOutput(TEXT("CellShadeParam"), 1, 1, 1, 1, 0));
}}
++ int32 UMaterialExpressionBreakMaterialAttributes::Compile
#code(C,nonumber,nomenu){{
 PropertyToIOIndexMap.Add(MP_PixelDepthOffset, 24);
}}
の下に追加分
#code(C,nonumber,nomenu){{
 PropertyToIOIndexMap.Add(MP_CellShadeParam, 25);
}}
+ Engine\Source\Runtime\Engine\Private\Materials\MaterialShared.cpp
++ void FMaterialAttributeDefinitionMap::InitializeAttributeMap()
#code(C,nonumber,nomenu){{
 Add(FGuid(0x0AC97EC3, 0xE3D047BA, 0xB610167D, 0xC4D919FF), TEXT("PixelDepthOffset"),		MP_PixelDepthOffset,		MCT_Float1,	FVector4(0,0,0,0), SF_Pixel);
}}
の下に追加分。GUIDは被ってはいけない。ピンの初期値もここ。
#code(C,nonumber,nomenu){{
 Add(FGuid(0x0AC97EC4, 0xE3D047BE, 0xB610168C, 0xC4D91203), TEXT("CellShadeParam"), MP_CellShadeParam, MCT_Float4, FVector4(0, 1, 0, 0), SF_Pixel);
}}
+ Engine\Source\Runtime\Engine\Classes\Materials\MaterialExpressionMakeMaterialAttributes.h
#code(C,nonumber,nomenu){{
 FExpressionInput PixelDepthOffset;
}}
の下に追加するパラメーターの変数を追加する
#code(C,nonumber,nomenu){{
 UPROPERTY()
 FExpressionInput CellShadeParam;
}}
+ Engine\Source\Runtime\Engine\Private\Materials\HLSLMaterialTranslator.h
++ FHLSLMaterialTranslator(...)
#code(C,nonumber,nomenu){{
 SharedPixelProperties[MP_PixelDepthOffset] = true;
}}
の下に追加するパラメーターの分初期化を追加
#code(C,nonumber,nomenu){{
 SharedPixelProperties[MP_CellShadeParam] = true;
}}
++ bool Translate()
#code(C,nonumber,nomenu){{
 Chunk[MP_PixelDepthOffset] = Material->CompilePropertyAndSetMaterialProperty(MP_PixelDepthOffset,this);
}}
の下に追加するパラメーターの分、値の取得を追加
#code(C,nonumber,nomenu){{
 Chunk[MP_CellShadeParam] = Material->CompilePropertyAndSetMaterialProperty(MP_CellShadeParam, this);
}}
+ Engine\Source\Editor\UnrealEd\Private\MaterialGraph.cpp
#code(C,nonumber,nomenu){{
 MaterialInputs.Add(FMaterialInputInfo(LOCTEXT("PixelDepthOffset", "Pixel Depth Offset"), MP_PixelDepthOffset, LOCTEXT( "PixelDepthOffsetToolTip", "Pixel Depth Offset" ) ));
}}
の下に追加
#code(C,nonumber,nomenu){{
 MaterialInputs.Add(FMaterialInputInfo(LOCTEXT("CellShadeParam", "Cell Shading Param"), MP_CellShadeParam, LOCTEXT("CellShadeParamToolTip", "Cell Shading Param")));
}}
+ シェーダーからマテリアルのパラメーターを取得する
Engine\Shaders\MaterialTemplate.usf
こんな感じ
#code(C,nonumber,nomenu){{
 half4 GetMaterialCellShadeParamRaw(FPixelMaterialInputs PixelMaterialInputs)
 {
     return PixelMaterialInputs.CellShadeParam;
 }
 half4 GetMaterialCellShadeParam(FPixelMaterialInputs PixelMaterialInputs)
 {
     return GetMaterialCellShadeParamRaw(PixelMaterialInputs);
 }
}}

    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS