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