-
Notifications
You must be signed in to change notification settings - Fork 0
Description
좋아, 특정 오브젝트(예: Sprite)를 Post-processing 이후에 별도로 렌더링하려면 Custom Render Feature를 만들어서 Unity의 렌더링 파이프라인에 직접 끼워 넣으면 돼. 이 방법은 완전 확실하게 Volume 효과를 피할 수 있어.
목표
Sprite(또는 오브젝트)를 별도 Layer에 넣고
해당 Layer를 Custom Render Feature에서 따로 렌더링
후처리(Post-processing) 이후에 그려지게 설정
- Render Feature 스크립트 생성
RenderObjectsAfterPost.cs
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class RenderObjectsAfterPost : ScriptableRendererFeature
{
[System.Serializable]
public class Settings
{
public LayerMask renderLayer;
public Material overrideMaterial;
public string passTag = "RenderObjectsAfterPost";
}
public Settings settings = new Settings();
class CustomRenderPass : ScriptableRenderPass
{
private string profilerTag;
private Material overrideMaterial;
private LayerMask layerMask;
private FilteringSettings filteringSettings;
private ShaderTagId shaderTagId = new ShaderTagId("UniversalForward");
public CustomRenderPass(string profilerTag, LayerMask layerMask, Material overrideMat)
{
this.profilerTag = profilerTag;
this.layerMask = layerMask;
this.overrideMaterial = overrideMat;
filteringSettings = new FilteringSettings(RenderQueueRange.all, layerMask);
renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing;
}
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
var drawingSettings = CreateDrawingSettings(shaderTagId, ref renderingData, SortingCriteria.CommonTransparent);
if (overrideMaterial != null)
drawingSettings.overrideMaterial = overrideMaterial;
context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref filteringSettings);
}
}
CustomRenderPass customPass;
public override void Create()
{
customPass = new CustomRenderPass(settings.passTag, settings.renderLayer, settings.overrideMaterial);
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
renderer.EnqueuePass(customPass);
}
}
- 적용 방법
A. Assets > Create > Rendering > Universal Render Pipeline > Renderer Feature
이름: RenderObjectsAfterPost
생성한 .cs 파일 붙이기
B. ForwardRenderer 세팅에 추가
-
Assets > Settings > UniversalRenderPipelineAsset_Renderer 열기
-
Renderer Features > Add Feature
-
RenderObjectsAfterPost 추가
C. 설정
Render Layer: PostFX 무시하고 싶은 오브젝트가 있는 Layer 선택
Override Material: (선택사항) 쉐이더 강제 덮어씌우기 가능
Render Pass Event: 이미 코드에서 AfterRenderingPostProcessing으로 설정
-
사용법 요약
-
PostFX 무시하고 싶은 오브젝트는 전용 Layer에 넣어
-
Base Camera에서 그 Layer 제외
-
Render Feature가 해당 Layer만 다시 렌더링
결과
해당 오브젝트는 완전히 볼륨 영향 없이, PostFX가 끝난 뒤에 그려짐!
필요하면 이 설정을 Shader Graph 기반 머티리얼에 최적화하거나, UI 전용으로도 바꿔줄 수 있어.
혹시 Sprite 외에 Particle System이나 Mesh도 같이 쓰고 있어?