티스토리 뷰

728x90

Universal Render Pipeline (URP, 이전에 Lightweight RP로 알려짐)은 Post Processing V3 / PPv3라고도하는 포스트 프로세싱 효과를 위해 통합 볼륨 시스템을 사용합니다. 이러한 효과에는 Bloom, Chromatic Aberration, Depth of Field, Color Adjustments, Tonemapping, Vignette 등이 포함됩니다. URP에는 아직 Ambient Occlusion이 없지만 로드맵에 있지만 자산에서 솔루션을 찾을 수도 있습니다

 

URP에서 통합 된 포스트 프로세싱 솔루션을 사용하려면 게임 오브젝트에 "볼륨"구성 요소를 추가하거나 계층 구조를 마우스 오른쪽 버튼으로 클릭하고 볼륨 제목 아래에서 무언가를 선택할 수 있습니다.

볼륨은 전체 씬 또는 로컬에 영향을주는 Global로 설정할 수 있으며, Collider (가급적이면 IsTrigger 사용 가능)를 추가해야합니다. 로컬을 사용하면 카메라가 볼륨 / 충돌기 내부에있을 때만 효과가 나타납니다. Blend Distance를 사용하여 부드러운 전환을 만들 수 있습니다.

가중치 설정도 있습니다. 가중치 설정은 후 처리 효과가 기여하는 정도를 나타냅니다. 0은 전혀없고 1은 완전합니다. 여러 볼륨이 겹치거나 다른 볼륨 내부에 볼륨이있는 경우 우선 순위 설정도 사용할 수 있습니다. 값이 높을수록 우선 순위가 높아집니다.

각 볼륨에는 후 처리 효과를 보유하는 프로필이 있습니다. 여러 볼륨이 동일한 프로필을 공유 할 수 있습니다. 새로 만들기 단추를 클릭하여 프로필을 만든 다음 재정의 추가 단추를 사용하여 목록에 효과를 추가하십시오. 각 효과에 대한 목록 및 정보는 여기를 참조하십시오.

각 설정에는 기본값이 있으며 회색으로 표시됩니다. 설정을 수정하려면 왼쪽에있는 확인란을 클릭하여 값을 재정의합니다. 이제 장면에 볼륨이 있으므로 게임 뷰에서 효과를보기 위해 카메라를 클릭하고 포스트 프로세싱이 활성화되어 있는지 확인합니다. 여기에서 화면 공간 앤티 앨리어싱을 찾을 수도 있습니다.

카메라에는 enviroment 아래에 볼륨 마스크 및 볼륨 트리거 설정도 있습니다. 마스크에는 카메라에 영향을 미칠 레이어가 포함됩니다. 해당 목록에 포함되지 않은 레이어의 볼륨은 카메라에 영향을 주지 않습니다. 트리거 설정은 로컬 볼륨에 대해 테스트하는 데 사용되는 변환입니다. 공백으로두면 카메라의 변환이 사용됩니다.

Custom Effects

현재 통합 볼륨 시스템은 사용자 지정 효과를 지원하지 않지만 로드맵에 있습니다. 대신 포워드 렌더러에 적용된 커스텀 렌더러 기능을 사용하여 글로벌 포스트 프로세싱 셰이더 효과를 적용 할 수 있습니다.

이 기능은 효과를 적용하기 위해 사용자 지정 셰이더를 사용하여 텍스처의 내용을 렌더링 텍스처에 복사하는 Blit을 사용합니다. 이 기능의 코드는 게시물 끝에 있습니다. 셰이더는 블릿에서 입력을 얻기 위해 "_MainTex"참조와 함께 Texture2D 속성을 포함해야 합니다. 그런 다음 이미지를 조정할 수 있습니다. One Minus 노드를 통해 색상을 반전하고 마스터 노드의 색상 입력에 전달합니다. 마스터 노드는 Unlit이어야합니다.이 모든 작업은 PBR 조명이 의미가 없는 화면 공간에서 수행되기 때문입니다.

셰이더 그래프는 블릿에 사용해서는 안되는 여러 패스를 생성합니다. 렌더러 기능에는 사용할 패스를 지정할 수있는 Blit Material Pass Index가 포함되어 있습니다. -1로 설정하면 모든 패스가 렌더링됩니다 (불투명 표면 모드에서 큰 검은 색 사각형이 나타나는 그림자 캐스터 포함). 0으로 설정하면 첫 번째 패스 만 사용됩니다.

 

다음은 여기 예제를 기반으로 이를 처리하는 기능에 대한 전체 코드입니다. 그것을 사용하기 위해 그것이 무엇을하는지 정말로 이해할 필요는 없습니다. Assets 어딘가에 있으면 Forward Renderer 기능 목록에서 사용할 수 있습니다.

 

또는 특정 소스/대상 설정 및 After Rendering 이벤트를 사용하여 포스트 프로세싱 효과가 적용된 블릿을 올바르게 처리하는 것과 같은 몇 가지 추가 기능이있는 업데이트 된 버전을 찾을 수 있습니다.

 

또한 런타임에 렌더러 기능을 활성화 / 비활성화 할 수 있도록하려면 해당 기능에 대한 공개 참조를 얻을 수 있습니다. 여기에서 예를 참조하십시오.

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
 
// Saved in Blit.cs
public class Blit : ScriptableRendererFeature {
 
    public class BlitPass : ScriptableRenderPass {
        public enum RenderTarget {
            Color,
            RenderTexture,
        }
 
        public Material blitMaterial = null;
        public int blitShaderPassIndex = 0;
        public FilterMode filterMode { get; set; }
 
        private RenderTargetIdentifier source { get; set; }
        private RenderTargetHandle destination { get; set; }
 
        RenderTargetHandle m_TemporaryColorTexture;
        string m_ProfilerTag;
         
        public BlitPass(RenderPassEvent renderPassEvent, Material blitMaterial, int blitShaderPassIndex, string tag) {
            this.renderPassEvent = renderPassEvent;
            this.blitMaterial = blitMaterial;
            this.blitShaderPassIndex = blitShaderPassIndex;
            m_ProfilerTag = tag;
            m_TemporaryColorTexture.Init("_TemporaryColorTexture");
        }
         
        public void Setup(RenderTargetIdentifier source, RenderTargetHandle destination) {
            this.source = source;
            this.destination = destination;
        }
         
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) {
            CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag);
 
            RenderTextureDescriptor opaqueDesc = renderingData.cameraData.cameraTargetDescriptor;
            opaqueDesc.depthBufferBits = 0;
 
            // Can't read and write to same color target, use a TemporaryRT
            if (destination == RenderTargetHandle.CameraTarget) {
                cmd.GetTemporaryRT(m_TemporaryColorTexture.id, opaqueDesc, filterMode);
                Blit(cmd, source, m_TemporaryColorTexture.Identifier(), blitMaterial, blitShaderPassIndex);
                Blit(cmd, m_TemporaryColorTexture.Identifier(), source);
            } else {
                Blit(cmd, source, destination.Identifier(), blitMaterial, blitShaderPassIndex);
            }
 
            context.ExecuteCommandBuffer(cmd);
            CommandBufferPool.Release(cmd);
        }
         
        public override void FrameCleanup(CommandBuffer cmd) {
            if (destination == RenderTargetHandle.CameraTarget)
                cmd.ReleaseTemporaryRT(m_TemporaryColorTexture.id);
        }
    }
 
    [System.Serializable]
    public class BlitSettings {
        public RenderPassEvent Event = RenderPassEvent.AfterRenderingOpaques;
 
        public Material blitMaterial = null;
        public int blitMaterialPassIndex = -1;
        public Target destination = Target.Color;
        public string textureId = "_BlitPassTexture";
    }
 
    public enum Target {
        Color,
        Texture
    }
 
    public BlitSettings settings = new BlitSettings();
    RenderTargetHandle m_RenderTextureHandle;
 
    BlitPass blitPass;
 
    public override void Create() {
        var passIndex = settings.blitMaterial != null ? settings.blitMaterial.passCount - 1 : 1;
        settings.blitMaterialPassIndex = Mathf.Clamp(settings.blitMaterialPassIndex, -1, passIndex);
        blitPass = new BlitPass(settings.Event, settings.blitMaterial, settings.blitMaterialPassIndex, name);
        m_RenderTextureHandle.Init(settings.textureId);
    }
 
    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) {
        var src = renderer.cameraColorTarget;
        var dest = (settings.destination == Target.Color) ? RenderTargetHandle.CameraTarget : m_RenderTextureHandle;
 
        if (settings.blitMaterial == null) {
            Debug.LogWarningFormat("Missing Blit Material. {0} blit pass will not execute. Check for missing reference in the assigned renderer.", GetType().Name);
            return;
        }
 
        blitPass.Setup(src, dest);
        renderer.EnqueuePass(blitPass);
    }
}

더 많은 예를 보려면 Alexander Ameye가 작성한 Outline Shader의 좋은 예가 있습니다. 이 게시물의 상단에있는 이미지와 유사한 효과를 내며 두 가지 렌더러 기능을 사용하여 만들어졌습니다. 첫 번째 기능은 overrideMaterial로 장면을 다시 그리는 데 사용되어 텍스처의 장면에있는 오브젝트의 법선을 캡처 한 다음 윤곽 셰이더 (및 깊이 텍스처)에서 사용됩니다. 그런 다음 해당 셰이더는 위의 Blit 기능과 유사한 렌더링 기능을 사용하여 화면에 표시됩니다.

 

여기에있는 UniversalRenderingExamples는 몇 가지 효과에 대해 렌더링 기능을 사용하는 몇 가지 예도 제공합니다.

'Unity > Shader' 카테고리의 다른 글

Fragment Shader  (0) 2021.01.21
Vertex Shader  (0) 2021.01.21
Structs  (0) 2021.01.20
HLSL  (0) 2021.01.20
Shaderlab  (0) 2021.01.19
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
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