#contents ---- * 参考 [#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); } }} |