Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

もんしょ先生が記事に書かれていましたが、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」+「.」でシェーダービルドを行うこと。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした