Страница 1 из 1

PostProcessEffectRenderer BlitFullscreenTriangle conflict?

СообщениеДобавлено: 24 июн 2020, 07:16
kitakun
Добрый день, столкнулся с проблемой при работе с пост эффектами.
Сейчас у меня есть 2 шейдера с разными пост эффектами, первая проблема - по отдельности оба работают, если использую вместе - то все пост эффекты (включая стандартные) перестают работать.
Вторая проблема - это context.command.BuiltInBlit и context.command.BlitFullscreenTriangle, BuiltInBlit работает как надо, но во всех примерах рекомендуют использовать BlitFullscreenTriangle, а в моем случае он просто создает черный треугольник в центре сцены (т.е. даже не на ScreenUI, а в WorldPosition).
BuiltinBlit как-то проигрывает по производительности? Я могу его использовать или все же нужно разобраться почему треугольник не хочет работать?
Так же как мне не ясно почему 2 моих эффекта ломают весь пост-стек. Сижу на "ванильном" рендере, без URPL и HDRPL.
Так работает на старом BuiltinBlit-е
Синтаксис:
Используется csharp
public sealed class DrunkEffectRenderer : PostProcessEffectRenderer<DrunkSettings>
    {
        private Material _drunkMat;

        public override void Render(PostProcessRenderContext context)
        {
            if (_drunkMat == null)
            {
                _drunkMat = GovnyakManager.DrunkEffectMaterial;
            }

            context.command.BuiltinBlit(context.source, context.destination, _drunkMat);
        }
    }
 


Так создает черный треугольник и все ломает:
Синтаксис:
Используется csharp
public sealed class DrunkEffectRenderer : PostProcessEffectRenderer<DrunkSettings>
    {
        public override void Render(PostProcessRenderContext context)
        {
            var sheet = context.propertySheets.Get(Shader.Find("Hidden/Drunk"));

            context.command.BlitFullscreenTriangle(context.source, context.destination, sheet, 0);
        }
    }
 


Сам шейдер эффекта:
Синтаксис:
Используется glsl
Shader "Hidden/Drunk"
{
        Properties
        {
                [HideInInspector] _MainTex ("Texture", 2D) = "black" {}
                _Offset1("Move Factor", float) = 0.05
                _Offset2("DoubleEffect Speed", float) = 0.5
                _Offset3("DoubleEffect Power", float) = 0.01
                _Offset4("Colors?", float) = 5
        }
        Subshader
        {
                Pass
                {
                        CGPROGRAM
                        #pragma vertex vertex_shader
                        #pragma fragment pixel_shader
                        #pragma target 2.0

                        sampler2D _MainTex;
                        float _Offset1;
                        float _Offset2;
                        float _Offset3;
                        float _Offset4;

                        float4 vertex_shader (float4 vertex:POSITION):SV_POSITION
                        {
                                return UnityObjectToClipPos(vertex);
                        }

                        float4 pixel_shader (float4 vertex:SV_POSITION):COLOR
                        {
                                vector <float,2> uv = vertex.xy/_ScreenParams.xy;
                                uv.x+=cos(uv.y*2.0+_Time.g)*_Offset1;
                                uv.y+=sin(uv.x*2.0+_Time.g)*_Offset1;
                                float offset = sin(_Time.g *_Offset2) * _Offset3;    
                                float4 a = tex2D(_MainTex,uv);    
                                float4 b = tex2D(_MainTex,uv-float2(sin(offset),0.0));    
                                float4 c = tex2D(_MainTex,uv+float2(sin(offset),0.0));    
                                float4 d = tex2D(_MainTex,uv-float2(0.0,sin(offset)));    
                                float4 e = tex2D(_MainTex,uv+float2(0.0,sin(offset)));        
                                return (a+b+c+d+e)/_Offset4;
                        }
                        ENDCG
                }
        }
}