LoginSignup
3
6

More than 5 years have passed since last update.

UE4でマテリアル出力にピンを追加(UE4.14.0)

Last updated at Posted at 2016-11-12

もんしょ先生が記事に書かれていましたが、4.14.0で見るとちょこちょこ変わってるっぽいのでメモがてら纏めました。

こんな感じでマテリアルの出力ピンにパラメーターを追加して、シェーダー内で取得する方法です。
MaterialEditor.png

参考

変更

ソースコード側の追加、修正

  • Engine/Source/Runtime/Engine/Public/SceneTypes.h
    158行目あたり
    //^^^ New material properties go above here ^^^^
    の上に追加するパラメーターを書く
SceneTypes.h
// -- add -- //
MP_ShadowColor,
// -- -- //
//^^^ New material properties go above here ^^^^
  • Engine/Source/Runtime/Engine/Classes/Materials/Material.h
    414行目あたり
    float3ならFVectorMaterialInput、floatならFScalarMaterialInput型とする。
Material.h
UPROPERTY()
FScalarMaterialInput PixelDepthOffset;

// -- add -- //
UPROPERTY()
FVectorMaterialInput ShadowColor;
// -- -- //
  • Engine/Source/Runtime/Engine/Classes/Materials/MaterialExpressionMakeMaterialAttributes.h
    66行目あたり
MaterialExpressionMakeMaterialAttributes.h
UPROPERTY()
FExpressionInput PixelDepthOffset;

// -- add -- //
UPROPERTY()
FExpressionInput ShadowColor;
// -- -- //
  • Engine/Source/Editor/UnrealEd/Private/MaterialGraph.cpp
    58行目あたり
MaterialGraph.cpp
MaterialInputs.Add(FMaterialInputInfo(LOCTEXT("PixelDepthOffset", "Pixel Depth Offset"), MP_PixelDepthOffset, LOCTEXT( "PixelDepthOffsetToolTip", "Pixel Depth Offset" ) ));

// -- add -- //
MaterialInputs.Add(FMaterialInputInfo(LOCTEXT("ShadowColor", "ShadowColor"), MP_ShadowColor, LOCTEXT("ShadowColorToolTip", "ShadowColor")));
// -- -- //
//^^^ New material properties go above here. ^^^^
  • Engine/Source/Runtime/Engine/Private/Materials/HLSLMaterialTranslator.h
    282行目あたり
HLSLMaterialTranslator.h
SharedPixelProperties[MP_Refraction] = true;
SharedPixelProperties[MP_PixelDepthOffset] = true;
// -- add -- //
SharedPixelProperties[MP_ShadowColor] = true;
// -- -- //

413行目あたり

HLSLMaterialTranslator.h
Chunk[MP_PixelDepthOffset] = Material->CompilePropertyAndSetMaterialProperty(MP_PixelDepthOffset,this);
// -- add -- //
Chunk[MP_ShadowColor] = Material->CompilePropertyAndSetMaterialProperty(MP_ShadowColor, this);
// -- -- //
  • Engine/Source/Runtime/Engine/Private/Materials/Material.cpp
    2348行目あたり
Material.cpp
static_assert(MP_MAX == 29, "New material properties must have DoMaterialAttributesReorder called on them to ensure that any future reordering of property pins is correctly applied.");

の29を、追加した数だけ増やす

Material.cpp
// -- modifi -- //
static_assert(MP_MAX == 29, "New material properties must have DoMaterialAttributesReorder called on them to ensure that any future reordering of property pins is correctly applied.");
// -- -- //

2554行目あたり

Material.cpp
DoMaterialAttributeReorder(&PixelDepthOffset, UE4Ver);
// -- add -- //
DoMaterialAttributeReorder(&ShadowColor, UE4Ver);
// -- -- //

3774行目あたり

Material.cpp
case MP_PixelDepthOffset:       return &PixelDepthOffset;
// -- add -- //
case MP_ShadowColor:        return &ShadowColor;
// -- -- //

4437行目あたり

Material.cpp
case MP_PixelDepthOffset:
    Active = !bIsTranslucentBlendMode;
    break;
// -- add -- //
case MP_ShadowColor:
    Active = true;
break;
// -- -- //
  • Engine/Source/Runtime/Engine/Private/Materials/MaterialExpressions.cpp
    3523行目あたり
MaterialExpressions.cpp
    static_assert(MP_MAX == 29, 

の29を、追加した数だけ増やす

MaterialExpressions.cpp
// -- modifi -- //
    static_assert(MP_MAX == 30, 
// -- -- //

3548行目あたり

MaterialExpressions.cpp
case MP_Refraction: Ret = Refraction.Compile(Compiler); Expression = Refraction.Expression; break;
case MP_PixelDepthOffset: Ret = PixelDepthOffset.Compile(Compiler); Expression = PixelDepthOffset.Expression; break;
// -- add -- //
case MP_ShadowColor: Ret = ShadowColor.Compile(Compiler); Expression = ShadowColor.Expression; break;
// -- -- //

3593行目あたり

MaterialExpressions.cpp
    static_assert(MP_MAX == 29, 

の29を、追加した数だけ増やす

MaterialExpressions.cpp
// -- modifi -- //
    static_assert(MP_MAX == 30, 
// -- -- //

3621行目あたり

MaterialExpressions.cpp
Outputs.Add(FExpressionOutput(TEXT("PixelDepthOffset"), 1, 1, 1, 1, 0));
// -- add -- //
Outputs.Add(FExpressionOutput(TEXT("ShadowColor"), 1, 1, 1, 1, 0));
// -- -- //
  • Engine/Source/Runtime/Engine/Private/Materials/MaterialShared.cpp
    2797行目あたり
    FGuidのIDは被らない数値を指定する。
    MCT_Float3は変数の方に合わせた列挙体で。
    SF_Pixelはどのシェーダーで使用するかで合わせる。
MaterialShared.cpp
Add(FGuid(0x0AC97EC3, 0xE3D047BA, 0xB610167D, 0xC4D919FF), TEXT("PixelDepthOffset"),        MP_PixelDepthOffset,        MCT_Float1, FVector4(0,0,0,0), SF_Pixel);
// -- add -- //
Add(FGuid(0x0AC97EC4, 0xE3D047BB, 0xB610167C, 0xC4D91A00), TEXT("ShadowColor"), MP_ShadowColor, MCT_Float3, FVector4(0, 0, 0, 0), SF_Pixel);
// -- -- //
Add(FGuid(0xA0119D44, 0xC456450D, 0x9C39C933, 0x1F72D8D1), TEXT("TessellationMultiplier"),  MP_TessellationMultiplier,  MCT_Float1, FVector4(1,0,0,0), SF_Hull);
  • 最後にエディタを一度落としてエンジンをビルドし直す。 リビルドした方がいいかも。

シェーダー側の追加、変更

  • Engine\Shaders\MaterialTemplate.usf
    取得関数を追加する
MaterialTemplate.usf
 // -- add -- //
half3 GetMaterialShadowColorRaw(FPixelMaterialInputs PixelMaterialInputs)
{
    return PixelMaterialInputs.ShadowColor;
}
half3 GetMaterialShadowColor(FPixelMaterialInputs PixelMaterialInputs)
{
    return saturate(GetMaterialShadowColorRaw(PixelMaterialInputs));
}
 // -- -- //

シェーダー内で値の取得

シェーダー内でMaterialTemplate.usfに追加した関数、GetMaterialShadowColor(PixelMaterialInputs);
で値が取れるようになる。
Engine\Shaders\BasePassPixelShader.usf
 FPixelShaderInOut_MainPS辺りで取るといいかも。

シェーダーを弄ったあとは、UE4エディター上で「Ctrl」+「Shift」+「.」でシェーダービルドを行うこと。

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6