์ด๋ฒˆ์—๋Š” RDG๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋จธํ‹ฐ๋ฆฌ์–ผ ๊ทธ๋ž˜ํ”„ ์—†์ด C++ ์ฝ”๋“œ(+ ์‰์ด๋” ์ฝ”๋“œ)๋กœ ์‰์ด๋”๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์‚ผ

#5.1 ๋ฒ„์ „ ๊ธฐ์ค€์ž„


๋ Œ๋” ํ•˜๋“œ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค(RHI), ๋ Œ๋” ๋””ํŽœ๋˜์‹œ ๊ทธ๋ž˜ํ”„(RDG)

RHI๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋Š” ๋‹จ์–ด์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด

๋‹ค์–‘ํ•œ ๋ Œ๋”๋ง API(DX12, Vulkan ๋“ฑ)์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ ˆ์ด์–ด์ž„


์‚ฌ์‹ค RHI์˜ ๊ธฐ๋Šฅ์„ ๋ณด๋ฉด ์ƒ๋‹นํžˆ ๋‚œ์žกํ•˜๊ณ  ์ˆ˜๋™์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ

์ด๋ŸฐRHI์˜ ๋ Œ๋” ์ปค๋งจ๋“œ๋“ค์„ ์–ด๋А์ •๋„ ์ž๋™ํ™”ํ•ด์ฃผ๋Š” ๊ฒŒ RDG์ธ๊ฑฐ์‹ฌ

a16711aa372a76b660b8f68b12d21a1dd58bd737c883

์ˆ˜์ƒํ•  ์ •๋„๋กœ ์„ธ์„ธํ•˜๊ณ  ์นœ์ ˆํ•œ ์žฅ๋ฌธ์˜ ์ฃผ์„๋“ค์„ ๋ณด๊ณ ์žˆ์œผ๋ฉด ๋ˆˆ๋ฌผ์ด ์•ž์„ ๊ฐ€๋ฆด ์ •๋„์ž„;;


์—ฌํŠผ ๋Œ€์ถฉ ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ์‰์ด๋”๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์‚ผ


ํ”„๋กœ์ ํŠธ์— ๋ชจ๋“ˆ ์ƒ์„ฑํ•˜๊ธฐ

๊ธ€๋กœ๋ฒŒ ์‰์ด๋”๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—”์ง„์ด ๋‹ค ๋กœ๋“œ๋˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๋กœ๋“œ๋˜์–ด์•ผ ํ•จ

๊ทธ๋ž˜์„œ ์ƒˆ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค๊ณ  ๋กœ๋”ฉ ํŽ˜์ด์ฆˆ๋ฅผ ์ข€ ์•ž๋‹น๊ฒจ ์ค„๊ฑฐ์ž„


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// .uproject ํŒŒ์ผ
"Modules": [
{
// ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ถ€๋ถ„
"Name": "๋Œ€์ถฉ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„",
"Type": "Runtime",
"LoadingPhase": "Default",
"AdditionalDependencies": [
"Engine"
]
},
// ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•  ๋ชจ๋“ˆ ์ •๋ณด
{
"Name": "CustomShaderModule",
"Type": "Runtime",
"LoadingPhase": "PostConfigInit"
}
],
// Source/"ํ”„๋กœ์ ํŠธ ์ด๋ฆ„".Target.cs ํŒŒ์ผ
using UnrealBuildTool;
using System.Collections.Generic;
public class UpTarget : TargetRules
{
public UpTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
DefaultBuildSettings = BuildSettingsVersion.V2;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
ExtraModuleNames.AddRange(new string[]{ "Up", "CustomShaderModule" });
}
}
// Source/"ํ”„๋กœ์ ํŠธ ์ด๋ฆ„"Editor.Target.cs ํŒŒ์ผ
using UnrealBuildTool;
using System.Collections.Generic;
public class UpEditorTarget : TargetRules
{
public UpEditorTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
DefaultBuildSettings = BuildSettingsVersion.V2;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
ExtraModuleNames.AddRange(new string[]{ "Up", "CustomShaderModule" });
}
}
cs

์šฐ์„ , "ํ”„๋กœ์ ํŠธ์ด๋ฆ„".uproject, Target.cs, Editor.Target.cs์— ๊ฐ๊ฐ ๋ชจ๋“ˆ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์‚ผ

.uproject ํŒŒ์ผ์€ json ํ˜•์‹์ด๋ผ ์ฃผ์„์€ ์ง€์šฐ์…ˆ

๋‚˜๋Š” ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์„ Up๋กœ ์ง€์–ด์„œ ์ €๋ ‡๊ฒŒ ์ผ๋Š”๋ฐ

๋Œ€์ถฉ ์•Œ์ž˜๋”ฑํ•˜๊ฒŒ ํด๋ž˜์Šค๋ž‘ AddRange๋ถ€๋ถ„ ๋ฐ”๊พธ์‚ผ


a16711aa372a69e87eb1d19528d5270300b7e2c20514

๊ทธ ํ›„, ํ”„๋กœ์ ํŠธ Source ํด๋” ์•ˆ์— ์ € ํด๋” ๋ฐ ํŒŒ์ผ๋“ค์„ ์ƒ์„ฑํ•ด์ฃผ๊ณ 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//CustomShaderModule.h
#pragma once
#include "CoreMinimal.h"
class FCustomShaderModule : public IModuleInterface
{
public:
virtual void StartupModule() override;
virtual void ShutdownModule() override {}
};
//CustomShaderModule.cpp
#include "CustomShaderModule.h"
#include "Modules/ModuleManager.h"
IMPLEMENT_MODULE(FCustomShaderModule, CustomShaderModule);
void FCustomShaderModule::StartupModule()
{
FString ModuleDir = FPaths::GameSourceDir() + TEXT("CustomShaderModule/");
FString ShaderDir = FPaths::Combine(ModuleDir, TEXT("Shaders"));
AddShaderSourceDirectoryMapping(TEXT("/CustomShaderModule"), ShaderDir);
}
//CustomShaderModule.Build.cs
using UnrealBuildTool;
using System.IO;
public class CustomShaderModule : ModuleRules
{
public CustomShaderModule(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine" });
PrivateDependencyModuleNames.AddRange(new string[] { "Renderer", "RenderCore", "RHI" });
string EnginePath = Path.GetFullPath(Target.RelativeEnginePath);
PublicIncludePaths.Add(EnginePath + "Source/Runtime/Renderer/Private");
}
}
cs

CustomShaderModule.h, cpp, build.cs ํŒŒ์ผ์— ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด์ฃผ์‚ผ


์ด์ œ ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ์ด ์ถ”๊ฐ€๋˜์—ˆ์œผ๋‹ˆ ํ”„๋กœ์ ํŠธ ํด๋”์— ๊ฐ€์„œ binaries, intermediate ํด๋” ์‚ญ์ œ ํ›„

.uproject ํŒŒ์ผ ์šฐํด๋ฆญ ํ›„ generate ์–ด์ฉŒ๊ตฌ ๋ˆ„๋ฅด๊ณ  ์™„๋ฃŒ๋˜๋ฉด ๋ฆฌ๋นŒ๋“œ ํ•œ๋ฒˆ ๋Œ๋ฆฌ์…ˆ


์‰์ด๋” ์ฝ”๋“œ ์ž‘์„ฑ์€ ๋ฐฅ๋จน๊ตฌ ์™€์„œ ์“ฐ๊ฒ ์‹ฌ

ํ˜น์‹œ ๊ถ๊ธˆํ•œ๊ฑฐ ์žˆ์œผ๋ฉด ๋Œ“๊ธ€๋กœ ์งˆ๋ฌธ ์ฃผ์‚ผ