Top > エンジン改造-マテリアルの出力にパラメーターを追加

UE4.15.1で検証

参考

メモ

  • EMaterialProperty - MP_MAXは33が限界。Uint32でビットマスクにして使っている。

やってみた

  1. Engine\Source\Runtime\Engine\Public\SceneTypes.h
    1. enum EMaterialProperty
       
      
       MP_PixelDepthOffset,
      の下に追加分
  2. Engine\Source\Runtime\Engine\Classes\Materials\Material.h
     
    
     FScalarMaterialInput PixelDepthOffset;
    の下に追加するパラメーターの変数を追加する
     
     
    
     UPROPERTY()
     FScalarMaterialInput CellShadeParam;
    • FScalarMaterialInput
    • FVector2MaterialInput
    • FVectorMaterialInput
  3. Engine\Source\Runtime\Engine\Private\Materials\Material.cpp
    1. void UMaterial::Serialize(...)
       
      
       static_assert(MP_MAX == 29,
      を追加した分のMP_MAX値にする
       
      
       static_assert(MP_MAX == 33,
    2. UMaterial::PostLoad()
       
      
       DoMaterialAttributeReorder(&PixelDepthOffset, UE4Ver);
      の下に追加分
       
      
       DoMaterialAttributeReorder(&CellShadeParam, UE4Ver);
    3. FExpressionInput* UMaterial::GetExpressionInputForProperty(...)
       
      
       case MP_PixelDepthOffset:        return &PixelDepthOffset;
      の下に追加分
       
      
       case MP_CellShadeParam:            return &CellShadeParam;
    4. UMaterial::CompilePropertyEx
       
      
       case MP_PixelDepthOffset:        return PixelDepthOffset.CompileWithDefault(Compiler, Property);
      の下に追加分
       
      
       case MP_CellShadeParam:            return CellShadeParam.CompileWithDefault(Compiler, Property);
    5. 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;
  4. Engine\Source\Runtime\Engine\Private\Materials\MaterialExpressions.cpp
    1. int32 UMaterialExpressionMakeMaterialAttributes::Compile(...)
    2. UMaterialExpressionBreakMaterialAttributes::UMaterialExpressionBreakMaterialAttributes(...)
       
      
       static_assert(MP_MAX == 29,
      を追加した分のMP_MAX値にする
       
      
       static_assert(MP_MAX == 33,
    3. UMaterialExpressionBreakMaterialAttributes::UMaterialExpressionBreakMaterialAttributes
       
      
       Outputs.Add(FExpressionOutput(TEXT("PixelDepthOffset"), 1, 1, 1, 1, 0));
      の下に追加分。
       
      
       Outputs.Add(FExpressionOutput(TEXT("CellShadeParam"), 1, 1, 1, 1, 0));
    4. int32 UMaterialExpressionBreakMaterialAttributes::Compile
       
      
       PropertyToIOIndexMap.Add(MP_PixelDepthOffset, 24);
      の下に追加分
       
      
       PropertyToIOIndexMap.Add(MP_CellShadeParam, 25);
  5. Engine\Source\Runtime\Engine\Private\Materials\MaterialShared.cpp
    1. 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);
  6. Engine\Source\Runtime\Engine\Classes\Materials\MaterialExpressionMakeMaterialAttributes.h
     
    
     FExpressionInput PixelDepthOffset;
    の下に追加するパラメーターの変数を追加する
     
     
    
     UPROPERTY()
     FExpressionInput CellShadeParam;
  7. Engine\Source\Runtime\Engine\Private\Materials\HLSLMaterialTranslator.h
    1. FHLSLMaterialTranslator(...)
       
      
       SharedPixelProperties[MP_PixelDepthOffset] = true;
      の下に追加するパラメーターの分初期化を追加
       
      
       SharedPixelProperties[MP_CellShadeParam] = true;
    2. bool Translate()
       
      
       Chunk[MP_PixelDepthOffset] = Material->CompilePropertyAndSetMaterialProperty(MP_PixelDepthOffset,this);
      の下に追加するパラメーターの分、値の取得を追加
       
      
       Chunk[MP_CellShadeParam] = Material->CompilePropertyAndSetMaterialProperty(MP_CellShadeParam, this);
  8. 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")));
  9. シェーダーからマテリアルのパラメーターを取得する
    Engine\Shaders\MaterialTemplate.usf
    こんな感じ
     
    -
    |
    !
     
    -
    |
    !
    
     half4 GetMaterialCellShadeParamRaw(FPixelMaterialInputs PixelMaterialInputs)
     {
         return PixelMaterialInputs.CellShadeParam;
     }
     half4 GetMaterialCellShadeParam(FPixelMaterialInputs PixelMaterialInputs)
     {
         return GetMaterialCellShadeParamRaw(PixelMaterialInputs);
     }

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2017-07-06 (木) 23:12:10 (775d)