Skip to content

볼륨 제외 버그 #31

@ojc1234

Description

@ojc1234

좋아, 특정 오브젝트(예: Sprite)를 Post-processing 이후에 별도로 렌더링하려면 Custom Render Feature를 만들어서 Unity의 렌더링 파이프라인에 직접 끼워 넣으면 돼. 이 방법은 완전 확실하게 Volume 효과를 피할 수 있어.


목표

Sprite(또는 오브젝트)를 별도 Layer에 넣고

해당 Layer를 Custom Render Feature에서 따로 렌더링

후처리(Post-processing) 이후에 그려지게 설정


  1. 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);
}

}


  1. 적용 방법

A. Assets > Create > Rendering > Universal Render Pipeline > Renderer Feature

이름: RenderObjectsAfterPost

생성한 .cs 파일 붙이기

B. ForwardRenderer 세팅에 추가

  1. Assets > Settings > UniversalRenderPipelineAsset_Renderer 열기

  2. Renderer Features > Add Feature

  3. RenderObjectsAfterPost 추가

C. 설정

Render Layer: PostFX 무시하고 싶은 오브젝트가 있는 Layer 선택

Override Material: (선택사항) 쉐이더 강제 덮어씌우기 가능

Render Pass Event: 이미 코드에서 AfterRenderingPostProcessing으로 설정


  1. 사용법 요약

  2. PostFX 무시하고 싶은 오브젝트는 전용 Layer에 넣어

  3. Base Camera에서 그 Layer 제외

  4. Render Feature가 해당 Layer만 다시 렌더링


결과

해당 오브젝트는 완전히 볼륨 영향 없이, PostFX가 끝난 뒤에 그려짐!


필요하면 이 설정을 Shader Graph 기반 머티리얼에 최적화하거나, UI 전용으로도 바꿔줄 수 있어.
혹시 Sprite 외에 Particle System이나 Mesh도 같이 쓰고 있어?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions