열차 목업의 내부 확인용 프로젝트
smchoi
2024-07-22 3fc9f79ca436203b0b5ba39b6a079ee086227c11
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//////////////////////////////////////////////////////
// MK Glow Mip Buffer                                   //
//                                                    //
// Created by Michael Kremmel                       //
// www.michaelkremmel.de                            //
// Copyright © 2020 All rights reserved.            //
//////////////////////////////////////////////////////
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
 
namespace MK.Glow
{    
    /// <summary>
    /// Renderbuffer based on a mip setup
    /// </summary>
    internal sealed class MipBuffer
    {
        private RenderTarget[] _renderTargets = new RenderTarget[PipelineProperties.renderBufferSize];
        internal RenderTarget[] renderTargets { get { return _renderTargets; } }
 
        public MipBuffer(string name, RenderPipeline renderPipeline)
        {
            if(renderPipeline == RenderPipeline.SRP)
            {
                for(int i = 0; i < PipelineProperties.renderBufferSize; i++)
                {
                    _renderTargets[i].identifier = Shader.PropertyToID(name + i);
                    #if UNITY_2018_2_OR_NEWER
                    _renderTargets[i].renderTargetIdentifier = new RenderTargetIdentifier(renderTargets[i].identifier, 0, CubemapFace.Unknown, -1);
                    #else
                    _renderTargets[i].renderTargetIdentifier = new RenderTargetIdentifier(renderTargets[i].identifier);
                    #endif
                }
            }
            else
            {
                for(int i = 0; i < PipelineProperties.renderBufferSize; i++)
                {
                    renderTargets[i].identifier = Shader.PropertyToID(name + i);
                }
            }
        }
 
        /// <summary>
        /// Create a specific level of the the buffer
        /// </summary>
        /// <param name="renderContext"></param>
        /// <param name="level"></param>
        /// <param name="cmd"></param>
        /// <param name="format"></param>
        internal void CreateTemporary(RenderContext[] renderContext, int level, CommandBuffer cmd, RenderTextureFormat format, RenderPipeline renderPipeline)
        {
            if(renderPipeline == RenderPipeline.SRP)
            {
                #if UNITY_2017_1_OR_NEWER
                cmd.GetTemporaryRT(renderTargets[level].identifier, renderContext[level].descriptor, FilterMode.Bilinear);
                #else
                cmd.GetTemporaryRT(renderTargets[level].identifier, renderContext[level].width, renderContext[level].height, 0, FilterMode.Bilinear, format, RenderTextureReadWrite.Default, 1);
                #endif
            }
            else
            {
                renderTargets[level].renderTexture = PipelineExtensions.GetTemporary(renderContext[level], format);
            }
        }
 
        /// <summary>
        /// Clear a specific level of the buffer
        /// </summary>
        /// <param name="cmd"></param>
        /// <param name="level"></param>
        internal void ClearTemporary(CommandBuffer cmd, int level, RenderPipeline renderPipeline)
        {
            if(renderPipeline == RenderPipeline.SRP)
                cmd.ReleaseTemporaryRT(renderTargets[level].identifier);
            else
                RenderTexture.ReleaseTemporary(renderTargets[level].renderTexture);
        }
    }
}