Unity 커스텀 렌더 파이프라인 가이드
이 문서는 Unity의 커스텀 렌더 파이프라인에서 렌더 루프를 생성하는 방법을 설명합니다. 이 문서를 통해 스크립터블 렌더 파이프라인의 기본 원칙을 배우고, 커스텀 렌더 파이프라인을 구축하는 데 필요한 단계를 익힐 수 있습니다.
콘텐츠
프로젝트 준비
렌더 루프를 위해 프로젝트를 다음과 같이 준비합니다.
- SRP 호환 셰이더를 만듭니다.
- 렌더링할 게임 오브젝트를 생성합니다.
- 커스텀 SRP의 기본 구조를 생성합니다.
선택적으로, SRP Core 패키지를 설치하여 셰이더에 SRP 배처 호환성을 추가할 수 있습니다.
SRP 호환 셰이더 만들기
스티우를 사용하여 지오메트리를 렌더링할 방법을 정의하는 LightMode 태그를 사용하여 SRP 호환 셰이더를 만듭니다. 아래와 같이 새 셰이더를 생성합니다.
Shader "Examples/SimpleUnlitColor"
{
SubShader
{
Pass
{
Tags { "LightMode" = "ExampleLightModeTag"}
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
float4x4 unity_MatrixVP;
float4x4 unity_ObjectToWorld;
struct Attributes
{
float4 positionOS : POSITION;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
};
Varyings vert (Attributes IN)
{
Varyings OUT;
float4 worldPos = mul(unity_ObjectToWorld, IN.positionOS);
OUT.positionCS = mul(unity_MatrixVP, worldPos);
return OUT;
}
float4 frag (Varyings IN) : SV_TARGET
{
return float4(0.5,1,0.5,1);
}
ENDHLSL
}
}
}
렌더링할 게임 오브젝트 생성
게임 오브젝트를 생성하여 이전에 만든 SRP 호환 셰이더를 사용할 수 있습니다.
- 새 머티리얼 에셋을 만듭니다.
- 머티리얼 에셋에 셰이더를 할당합니다.
- 씬에 큐브를 생성하고, 큐브에 머티리얼을 할당합니다.
커스텀 SRP의 기본 구조 생성
커스텀 SRP에 필요한 기본 소스 파일을 생성하고, Unity에 렌더링을 시작하도록 지시합니다. 아래와 같은 코드로 RenderPipeline 클래스를 상속하여 클립을 작성합니다.
public class ExampleRenderPipeline : RenderPipeline {
public ExampleRenderPipeline() {
}
protected override void Render (ScriptableRenderContext context, Camera[] cameras) {
// 렌더 타겟을 지우고, 필요에 따라 다른 기능을 추가합니다.
}
}
렌더 루프 생성
렌더 루프의 기본 작업은 다음과 같습니다:
렌더 타겟 지우기
렌더 타겟을 지우는 작업입니다. 다음 단계를 따릅니다:
- Clear 커맨드를 사용하여 CommandBuffer를 설정합니다.
- ScriptableRenderContext의 커맨드 대기열에 CommandBuffer를 추가합니다.
- 그래픽스 API에 명령을 전달합니다.
예제 코드는 다음과 같습니다.
var cmd = new CommandBuffer();
cmd.ClearRenderTarget(true, true, Color.black);
context.ExecuteCommandBuffer(cmd);
cmd.Release();
context.Submit();
컬링
컬링은 카메라에 보이지 않는 지오메트리를 필터링하는 과정입니다. 스크립터블 렌더 파이프라인에서 컬링을 수행하는 방법은 다음과 같습니다:
- ScriptableCullingParameters 구조체를 카메라에 대한 데이터로 채웁니다.
- ScriptableRenderContext.Cull을 호출하고, 결과를 CullingResults 구조체에 저장합니다.
관련 코드 예시는 다음과 같습니다.
foreach (Camera camera in cameras) {
camera.TryGetCullingParameters(out var cullingParameters);
var cullingResults = context.Cull(ref cullingParameters);
}
그리기
그리기는 특정 지오메트리를 그리도록 지시하는 작업입니다. 그리기를 수행하기 위한 단계는 다음과 같습니다:
- 컬링 작업을 수행하고 결과를 CullingResults에 저장합니다.
- FilteringSettings 및 DrawingSettings 구조체를 생성합니다.
- ScriptableRenderContext.DrawRenderers를 호출합니다.
다음은 예제 코드입니다.
context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings);
결론
이 가이드는 Unity의 커스텀 렌더 파이프라인을 사용하여 렌더 루프를 생성하는 방법을 설명합니다. 이 원칙들을 이해하고 적용함으로써, 여러분은 더 복잡한 렌더링 작업을 수행할 수 있는 기반을 구축할 수 있습니다. Unity를 통해 창의적인 비주얼을 만들어 보세요!