概要
UnrealEngineで独自のシェーディング表現を使いたいとき、UnealEngineの改造を行うという手法をとれます。 Unityを使用していた時と比べるとパッとRenderingFeatureを追加してパスを増やしたりシェーダーを追加したりすることができる感覚がありましたがUnrealEngineではそうはいきません。
シェーディングモデルを追加すると独自のカスタム表現を行えますし、マテリアルピンの追加・削除を行うことができます。 今回はUE5.4.4からエンジンを改造し、独自のシェーディングモデルを追加していきましょう。
前提条件
この記事では
- Unreal Engine 5.4.4
- ディファードレンダリング対応
- フォワードレンダリング非対応
- PC向け対応
- Lumen、Substrate非対応
として改造を行っていきます。
環境整備
まずUnrealEngineのソースコードを取得しなければいけません。以下にアクセスします。
https://www.unrealengine.com/ja/ue-on-github

ここに書いてある通り進めていけば大丈夫です。
EpicとGitHubのアカウント連携が終了すれば以下のようにリポジトリを閲覧することができます。 ここからリポジトリをクローンします。

この後の操作をする前に(容量が大きくなる前に)ブランチは改造を行うブランチに変更しておきましょう。(今回は5.4ブランチにチェックアウト)
その後、Setup.batを叩いて、その後にGenerateProjectFiles.batをたたきます。

VisualStudioで開いた後、UE5をスタートアッププロジェクトに設定し、DevelopmentEditor>Win64を選択した後ソリューションのリビルドを行います。


ビルドは自分のPCでは2-3時間かかったので気長に待ちましょう、、
ビルドを成功したらテンプレートの画面が出てきます。

プロジェクトを新しく作る場合はここから選びますが基本的にエンジンが置かれているディレクトリに配置したほうがパスを通すのが楽です。 プロジェクトを作成してからVisualStudioに戻るとファイルの変更検知が入るので「再読み込み」を選択します。
ソリューションエクスプローラーにプロジェクトが追加されていたらそちらを「スタートアッププロジェクトに設定」します。
ビルドエラー解消
普通にビルドが通ればいいのですが、自分の場合はエラーが出て失敗してしまいました。
いろいろ疑うところは結構多いのですが、一番最初はVisualStudioのバージョンを見てみてください。 自分はVisualStudioが2022 17.11.2を使っていてかなりのエラーが出たのですが、2022 17.11.3にアップデートしたらたくさんのエラーが消えました。
その次にWindowsSDKでWindows11 SDK 10.0.22621.2428をクリーンインストールすることで定数オーバーフローの問題を解決できました。
コードベースでいうと VisualStudioでビルド -> 構成マネージャ で AutoRTFMTests のチェックをすべてはずした状態にしてから以下のコードを追加します。
Engine\Source\Programs\AutoRTFMTests\AutoRTFMTests.Target.cs
// ~~~ (中略) ~~~ public AutoRTFMTestsTarget(TargetInfo Target) : base(Target) { // ~~~ (中略) ~~~ bFNameOutlineNumber = true; // ビルドエラー解消のため追加 bBuildInSolutionByDefault = false; } }
参考は以下です。 zenn.dev
ビルドエラーに関しては環境の問題が多いかと思いますが参考になった記事を列挙します。
5.4 source build errors - #7 by monstercoo - Platform & Builds - Epic Developer Community Forums
Plugin Build fails only on UE5.4 - Platform & Builds - Epic Developer Community Forums
エンジン改造
ではエンジンを改造していきましょう。
まずはシェーディングモデルの追加です。MaterialShadingModelの略称でMSMをつけるのが慣習となっています。
Runtime/Engine/Classes/Engine/EngineTypes.h
UENUM() enum EMaterialShadingModel : int { MSM_Unlit UMETA(DisplayName = "Unlit"), MSM_DefaultLit UMETA(DisplayName = "Default Lit"), MSM_Subsurface UMETA(DisplayName = "Subsurface"), MSM_PreintegratedSkin UMETA(DisplayName = "Preintegrated Skin"), MSM_ClearCoat UMETA(DisplayName = "Clear Coat"), MSM_SubsurfaceProfile UMETA(DisplayName = "Subsurface Profile"), MSM_TwoSidedFoliage UMETA(DisplayName = "Two Sided Foliage"), MSM_Hair UMETA(DisplayName = "Hair"), MSM_Cloth UMETA(DisplayName = "Cloth"), MSM_Eye UMETA(DisplayName = "Eye"), MSM_SingleLayerWater UMETA(DisplayName = "SingleLayerWater"), MSM_ThinTranslucent UMETA(DisplayName = "Thin Translucent"), MSM_Strata UMETA(DisplayName = "Substrate", Hidden), //// 2025/01/14 @EguchiDaiki MSM_ToonLit UMETA(DisplayName = "Toon Lit"), //// 2025/01/14 @EguchiDaiki /** Number of unique shading models. */ MSM_NUM UMETA(Hidden), /** Shading model will be determined by the Material Expression Graph, by utilizing the 'Shading Model' MaterialAttribute output pin. */ MSM_FromMaterialExpression UMETA(DisplayName = "From Material Expression"), MSM_MAX };
シェーディングモデルを取得する関数にも追加したシェーディングモデルを追加しましょう。
Runtime/Engine/Private/Materials/MaterialShader.cpp
FString GetShadingModelString(EMaterialShadingModel ShadingModel) { FString ShadingModelName; switch(ShadingModel) { case MSM_Unlit: ShadingModelName = TEXT("MSM_Unlit"); break; case MSM_DefaultLit: ShadingModelName = TEXT("MSM_DefaultLit"); break; case MSM_Subsurface: ShadingModelName = TEXT("MSM_Subsurface"); break; case MSM_PreintegratedSkin: ShadingModelName = TEXT("MSM_PreintegratedSkin"); break; case MSM_ClearCoat: ShadingModelName = TEXT("MSM_ClearCoat"); break; case MSM_SubsurfaceProfile: ShadingModelName = TEXT("MSM_SubsurfaceProfile"); break; case MSM_TwoSidedFoliage: ShadingModelName = TEXT("MSM_TwoSidedFoliage"); break; case MSM_Hair: ShadingModelName = TEXT("MSM_Hair"); break; case MSM_Cloth: ShadingModelName = TEXT("MSM_Cloth"); break; case MSM_Eye: ShadingModelName = TEXT("MSM_Eye"); break; case MSM_SingleLayerWater: ShadingModelName = TEXT("MSM_SingleLayerWater"); break; case MSM_ThinTranslucent: ShadingModelName = TEXT("MSM_ThinTranslucent"); break; //// 2025/01/14 @EguchiDaiki case MSM_ToonLit: ShadingModelName = TEXT("MSM_ToonLit"); break; //// 2025/01/14 @EguchiDaiki default: ShadingModelName = TEXT("Unknown"); break; } return ShadingModelName; }
1934行に追加です。シェーディングモデルにToonLitが追加されている場合はSetDefineによって定数を立てます。
Runtime/Engine/Private/Materials/HLSLMaterialTranslator.cpp
void FHLSLMaterialTranslator::GetMaterialEnvironment(EShaderPlatform InPlatform, FShaderCompilerEnvironment& OutEnvironment) { if (ShadingModels.IsLit()) { //// 2025/01/14 @EguchiDaiki if (ShadingModels.HasShadingModel(MSM_ToonLit)) { OutEnvironment.SetDefine(TEXT("MATERIAL_SHADINGMODEL_TOON_LIT"), TEXT("1")); NumSetMaterials++; } //// 2025/01/14 @EguchiDaiki } }
Runtime/Engine/Private/Materials/MaterialHLSLEmitter.cpp
ここではTranslatorと同様に処理を行います。
static void GetMaterialEnvironment(EShaderPlatform InPlatform, const FMaterial& InMaterial, const UE::HLSLTree::FEmitContext& EmitContext, const FMaterialCompilationOutput& MaterialCompilationOutput, FShaderCompilerEnvironment& OutEnvironment) { ///// 中略 if (ShadingModels.IsLit()) { //// 中略 //// @EguchiDaiki if (ShadingModels.HasShadingModel(MSM_ToonLit)) { OutEnvironment.SetDefine(TEXT("MATERIAL_SHADINGMODEL_TOON_LIT"), TEXT("1")); NumSetMaterials++; } } //// @EguchiDaiki
Runtime/RenderCore/Public/ShaderMaterial.h
こちらではToonLitに対応したシェーダーのバリエーションの判定変数を立てます。
struct FShaderMaterialPropertyDefines { //DECLARE_TYPE_LAYOUT(FShaderMaterialPropertyDefines, NonVirtual); //void ModifyEnvironment(FShaderCompilerEnvironment& OutEnvironment) const; //void WriteFrozenVertexFactoryParameters(FMemoryImageWriter& Writer, const TMemoryImagePtr<FShaderMaterialPropertyDefines>& InPropDefines) const; uint8 MATERIAL_ENABLE_TRANSLUCENCY_FOGGING : 1; uint8 MATERIALBLENDING_ANY_TRANSLUCENT : 1; uint8 MATERIAL_USES_SCENE_COLOR_COPY : 1; uint8 MATERIALBLENDING_MASKED_USING_COVERAGE : 1; uint8 MATERIAL_COMPUTE_FOG_PER_PIXEL : 1; uint8 MATERIAL_SHADINGMODEL_UNLIT : 1; uint8 MATERIAL_SHADINGMODEL_DEFAULT_LIT : 1; uint8 MATERIAL_SHADINGMODEL_SUBSURFACE : 1; uint8 MATERIAL_SHADINGMODEL_PREINTEGRATED_SKIN : 1; uint8 MATERIAL_SHADINGMODEL_SUBSURFACE_PROFILE : 1; uint8 MATERIAL_SHADINGMODEL_CLEAR_COAT : 1; uint8 MATERIAL_SHADINGMODEL_TWOSIDED_FOLIAGE : 1; uint8 MATERIAL_SHADINGMODEL_HAIR : 1; uint8 MATERIAL_SHADINGMODEL_CLOTH : 1; uint8 MATERIAL_SHADINGMODEL_EYE : 1; uint8 MATERIAL_SHADINGMODEL_SINGLELAYERWATER : 1; uint8 SINGLE_LAYER_WATER_SEPARATED_MAIN_LIGHT : 1; uint8 MATERIAL_SHADINGMODEL_THIN_TRANSLUCENT : 1; //// @EguchiDaiki uint8 MATERIAL_SHADINGMODEL_TOON_LIT : 1; //// @EguchiDaiki
Runtime/Engine/Private/ShaderCompiler/ShaderGenerationUtil.cpp
TranslatorやEmitterでSetDefineした場合、ShaderMaterial.hに定義したMATERIAL_SHADING_MODEL_LITにSetDefineした値が格納されます。 マクロであるFETCH_COMPILE_BOOLを立てます。
void FShaderCompileUtilities::ApplyFetchEnvironment(FShaderMaterialPropertyDefines& SrcDefines, FShaderCompilerEnvironment& OutEnvironment) { FETCH_COMPILE_BOOL(MATERIAL_ENABLE_TRANSLUCENCY_FOGGING); FETCH_COMPILE_BOOL(MATERIALBLENDING_ANY_TRANSLUCENT); FETCH_COMPILE_BOOL(MATERIAL_USES_SCENE_COLOR_COPY); FETCH_COMPILE_BOOL(MATERIALBLENDING_MASKED_USING_COVERAGE); FETCH_COMPILE_BOOL(MATERIAL_COMPUTE_FOG_PER_PIXEL); FETCH_COMPILE_BOOL(MATERIAL_SHADINGMODEL_UNLIT); FETCH_COMPILE_BOOL(MATERIAL_SHADINGMODEL_DEFAULT_LIT); FETCH_COMPILE_BOOL(MATERIAL_SHADINGMODEL_SUBSURFACE); FETCH_COMPILE_BOOL(MATERIAL_SHADINGMODEL_PREINTEGRATED_SKIN); FETCH_COMPILE_BOOL(MATERIAL_SHADINGMODEL_SUBSURFACE_PROFILE); FETCH_COMPILE_BOOL(MATERIAL_SHADINGMODEL_CLEAR_COAT); FETCH_COMPILE_BOOL(MATERIAL_SHADINGMODEL_TWOSIDED_FOLIAGE); FETCH_COMPILE_BOOL(MATERIAL_SHADINGMODEL_HAIR); FETCH_COMPILE_BOOL(MATERIAL_SHADINGMODEL_CLOTH); FETCH_COMPILE_BOOL(MATERIAL_SHADINGMODEL_EYE); FETCH_COMPILE_BOOL(MATERIAL_SHADINGMODEL_SINGLELAYERWATER); FETCH_COMPILE_BOOL(MATERIAL_SHADINGMODEL_THIN_TRANSLUCENT); //// @EguchiDaikoi FETCH_COMPILE_BOOL(MATERIAL_SHADINGMODEL_TOON_LIT); //// @EguchiDaiki
Runtime/Engine/Private/ShaderCompiler/ShaderGenerationUtil.cpp
バリエーションに対応してシェーディングモデルが使用するGBUFFERスロットを指定します。Slotに格納した情報をもとにGBUFFERのエンコード、デコードしたシェーダコードが生成されます。
static void DetermineUsedMaterialSlots( bool Slots[], const FShaderMaterialDerivedDefines& Dst, const FShaderMaterialPropertyDefines& Mat, const FShaderLightmapPropertyDefines& Lightmap, const FShaderGlobalDefines& SrcGlobal, const FShaderCompilerDefines& Compiler, ERHIFeatureLevel::Type FEATURE_LEVEL) { //// 中略 // doesn't write to GBuffer if (Mat.MATERIAL_SHADINGMODEL_THIN_TRANSLUCENT) { } //// @EguchiDaiki if (Mat.MATERIAL_SHADINGMODEL_TOON_LIT) { SetStandardGBufferSlots(Slots, bWriteEmissive, bHasTangent, bHasVelocity, bHasStaticLighting, bIsStrataMaterial); Slots[GBS_CustomData] = bUseCustomData; } //// @EguchiDaiki
Shaders/Private/Definitions.usf
定義ファイルに未定義の場合の処理を担保させるために追記します。
#ifndef MATERIAL_SHADINGMODEL_UNLIT #define MATERIAL_SHADINGMODEL_UNLIT 0 #endif #ifndef MATERIAL_SHADINGMODEL_SINGLELAYERWATER #define MATERIAL_SHADINGMODEL_SINGLELAYERWATER 0 #endif //// @EguchiDaiki #ifndef MATERIAL_SHADINGMODEL_TOON_LIT #define MATERIAL_SHADINGMODEL_TOON_LIT 0 #endif //// @EguchiDaiki
Shaders/Private/ShadingCommon.ush
シェーディングモデルIDのナンバリングをEngineTypes.hで定義したEMaterialShadingModelと一致させます。
// SHADINGMODELID_* occupy the 4 low bits of an 8bit channel and SKIP_* occupy the 4 high bits #define SHADINGMODELID_UNLIT 0 #define SHADINGMODELID_DEFAULT_LIT 1 #define SHADINGMODELID_SUBSURFACE 2 #define SHADINGMODELID_PREINTEGRATED_SKIN 3 #define SHADINGMODELID_CLEAR_COAT 4 #define SHADINGMODELID_SUBSURFACE_PROFILE 5 #define SHADINGMODELID_TWOSIDED_FOLIAGE 6 #define SHADINGMODELID_HAIR 7 #define SHADINGMODELID_CLOTH 8 #define SHADINGMODELID_EYE 9 #define SHADINGMODELID_SINGLELAYERWATER 10 #define SHADINGMODELID_THIN_TRANSLUCENT 11 #define SHADINGMODELID_STRATA 12 // Temporary while we convert everything to Strata //// @EguchiDaiki #if 0 #define SHADINGMODELID_NUM 13 #else #define SHADINGMODELID_TOON_LIT 13 #define SHADINGMODELID_NUM 14 #endif //// @ EguchiDaiki #define SHADINGMODELID_MASK 0xF // 4 bits reserved for ShadingModelID //// @EguchiDaiki
次にデバッグ用途で使用されるシェーディングモデルIDの色を取得する関数にも色の定義を行います。 PS4ではswitch文の最適化が不適切なためにPS4用にif文の処理とそれ以外で使用するswitchの2種類を用意します。
#define SSS_PROFILE_ID_INVALID 256 #define SSS_PROFILE_ID_PERPIXEL 512 // for debugging and to visualize float3 GetShadingModelColor(uint ShadingModelID) { // TODO: PS4 doesn't optimize out correctly the switch(), so it thinks it needs all the Samplers even if they get compiled out // This will get fixed after launch per Sony... #if PS4_PROFILE if (ShadingModelID == SHADINGMODELID_UNLIT) return float3(0.1f, 0.1f, 0.2f); // Dark Blue else if (ShadingModelID == SHADINGMODELID_DEFAULT_LIT) return float3(0.1f, 1.0f, 0.1f); // Green else if (ShadingModelID == SHADINGMODELID_SUBSURFACE) return float3(1.0f, 0.1f, 0.1f); // Red else if (ShadingModelID == SHADINGMODELID_PREINTEGRATED_SKIN) return float3(0.6f, 0.4f, 0.1f); // Brown else if (ShadingModelID == SHADINGMODELID_CLEAR_COAT) return float3(0.1f, 0.4f, 0.4f); else if (ShadingModelID == SHADINGMODELID_SUBSURFACE_PROFILE) return float3(0.2f, 0.6f, 0.5f); // Cyan else if (ShadingModelID == SHADINGMODELID_TWOSIDED_FOLIAGE) return float3(0.2f, 0.2f, 0.8f); // Blue else if (ShadingModelID == SHADINGMODELID_HAIR) return float3(0.6f, 0.1f, 0.5f); else if (ShadingModelID == SHADINGMODELID_CLOTH) return float3(0.7f, 1.0f, 1.0f); else if (ShadingModelID == SHADINGMODELID_EYE) return float3(0.3f, 1.0f, 1.0f); else if (ShadingModelID == SHADINGMODELID_SINGLELAYERWATER) return float3(0.5f, 0.5f, 1.0f); else if (ShadingModelID == SHADINGMODELID_THIN_TRANSLUCENT) return float3(1.0f, 0.8f, 0.3f); else if (ShadingModelID == SHADINGMODELID_STRATA) return float3(1.0f, 1.0f, 0.0f); //// @EguchiDaiki else if (ShadingModelID == SHADINGMODELID_TOON_LIT) return float3(1.0f, 0.4f, 0.0f); //// @EguchiDaiki else return float3(1.0f, 1.0f, 1.0f); // White #else switch(ShadingModelID) { case SHADINGMODELID_UNLIT: return float3(0.1f, 0.1f, 0.2f); // Dark Blue case SHADINGMODELID_DEFAULT_LIT: return float3(0.1f, 1.0f, 0.1f); // Green case SHADINGMODELID_SUBSURFACE: return float3(1.0f, 0.1f, 0.1f); // Red case SHADINGMODELID_PREINTEGRATED_SKIN: return float3(0.6f, 0.4f, 0.1f); // Brown case SHADINGMODELID_CLEAR_COAT: return float3(0.1f, 0.4f, 0.4f); // Brown case SHADINGMODELID_SUBSURFACE_PROFILE: return float3(0.2f, 0.6f, 0.5f); // Cyan case SHADINGMODELID_TWOSIDED_FOLIAGE: return float3(0.2f, 0.2f, 0.8f); // Cyan case SHADINGMODELID_HAIR: return float3(0.6f, 0.1f, 0.5f); case SHADINGMODELID_CLOTH: return float3(0.7f, 1.0f, 1.0f); case SHADINGMODELID_EYE: return float3(0.3f, 1.0f, 1.0f); case SHADINGMODELID_SINGLELAYERWATER: return float3(0.5f, 0.5f, 1.0f); case SHADINGMODELID_THIN_TRANSLUCENT: return float3(1.0f, 0.8f, 0.3f); case SHADINGMODELID_STRATA: return float3(1.0f, 1.0f, 0.0f); //// @EguchiDaiki case SHADINGMODELID_TOON_LIT: return float3(1.0f, 0.4f, 0.0f); //// @EguchiDaiki default: return float3(1.0f, 1.0f, 1.0f); // White } #endif }
Shaders/Private/ShadingModels.ush
ToonLitの独自シェーディングモデルを使用している際のライティング処理を追加します。
独自のライティング処理はこの新しく追加した関数にいろいろと定義していきますが一旦は何もせず黒を返します。
FDirectLighting PreintegratedSkinBxDF( FGBufferData GBuffer, half3 N, half3 V, half3 L, float Falloff, half NoL, FAreaLight AreaLight, FShadowTerms Shadow ) { FDirectLighting Lighting = DefaultLitBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow ); half3 SubsurfaceColor = ExtractSubsurfaceColor(GBuffer); half Opacity = GBuffer.CustomData.a; half3 PreintegratedBRDF = Texture2DSampleLevel(View.PreIntegratedBRDF, View.PreIntegratedBRDFSampler, float2(saturate(dot(N, L) * .5 + .5), 1 - Opacity), 0).rgb; Lighting.Transmission = AreaLight.FalloffColor * Falloff * PreintegratedBRDF * SubsurfaceColor; return Lighting; } //// @EguchiDaiki FDirectLighting ToonLitBxDF(FGBufferData GBuffer, half3 N, half3 V, half3 L, float Falloff, half NoL, FAreaLight AreaLight, FShadowTerms Shadow) { FDirectLighting Lighting = (FDirectLighting)0; return Lighting; } //// @EguchiDaiki
その独自のライティング関数を使用するため以下のように処理を追加します。
FDirectLighting IntegrateBxDF( FGBufferData GBuffer, half3 N, half3 V, half3 L, float Falloff, half NoL, FAreaLight AreaLight, FShadowTerms Shadow ) { switch( GBuffer.ShadingModelID ) { case SHADINGMODELID_DEFAULT_LIT: case SHADINGMODELID_SINGLELAYERWATER: case SHADINGMODELID_THIN_TRANSLUCENT: return DefaultLitBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow ); case SHADINGMODELID_SUBSURFACE: return SubsurfaceBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow ); case SHADINGMODELID_PREINTEGRATED_SKIN: return PreintegratedSkinBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow ); case SHADINGMODELID_CLEAR_COAT: return ClearCoatBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow ); case SHADINGMODELID_SUBSURFACE_PROFILE: return SubsurfaceProfileBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow ); case SHADINGMODELID_TWOSIDED_FOLIAGE: return TwoSidedBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow ); case SHADINGMODELID_HAIR: return HairBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow ); case SHADINGMODELID_CLOTH: return ClothBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow ); case SHADINGMODELID_EYE: return EyeBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow ); //// @EguchiDaiki case SHADINGMODELID_TOON_LIT: return ToonLitBxDF( GBuffer, N, V, L, Falloff, NoL, AreaLight, Shadow ); //// @EguchiDaiki default: return (FDirectLighting)0; } }
Shaders/Private/ReflectionEnvironmentPixelShader.usf
一旦環境光や反射表現の計算をスキップするようにします。 またシェーダー内部の仕様が決まったらこちらも詰めて書いていきます。
void ReflectionEnvironmentSkyLighting( in float4 SvPosition : SV_Position, out float4 OutColor : SV_Target0 #if STRATA_OPAQUE_ROUGH_REFRACTION_ENABLED , out float3 OutOpaqueRoughRefractionSceneColor : SV_Target1 , out float3 OutSubSurfaceSceneColor : SV_Target2 #endif ) { uint2 PixelPos = SvPosition.xy; float2 BufferUV = SvPositionToBufferUV(SvPosition); float2 ScreenPosition = SvPositionToScreenPosition(SvPosition).xy; OutColor = 0.0f; #if STRATA_OPAQUE_ROUGH_REFRACTION_ENABLED OutOpaqueRoughRefractionSceneColor = 0.0f; OutSubSurfaceSceneColor = 0.0f; #endif #if STRATA_ENABLED //// 中略 #else // STRATA_ENABLED // Sample scene textures. FGBufferData GBuffer = GetGBufferDataFromSceneTextures(BufferUV); uint ShadingModelID = GBuffer.ShadingModelID; //// @EguchiDaiki #if 0 const bool bUnlitMaterial = ShadingModelID == SHADINGMODELID_UNLIT; #else const bool bUnlitMaterial = ShadingModelID == SHADINGMODELID_UNLIT || ShadingModelID == SHADINGMODELID_TOON_LIT; #endif //// @EguchiDaiki float3 DiffuseColor = GBuffer.DiffuseColor; float3 SpecularColor = GBuffer.SpecularColor; RemapClearCoatDiffuseAndSpecularColor(GBuffer, ScreenPosition, DiffuseColor, SpecularColor);
結果
上記を行ってリビルドを実行します。
ビルドが成功した後、プロジェクトを開きMaterialEditorからシェーディングモデルを確認するとToonLitが追加されていたことを確認します。

ただ、これを使用してもライティングは未実装なので真っ黒になるかと思います。
次はライティングの内部、そしてトゥーンシェーディングの実装をどんどん行っていきます。


















































