参考

メモ

  • 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