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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions