Постобработка Unity PostProcessEffectRenderer отображается в редакторе, но не в сборке - PullRequest
1 голос
/ 13 апреля 2019

После добавления реализации PostProcessEffectRenderer в стек постобработки Unity эффект отлично работает в редакторе Unity, но не отображается во встроенной игре.

Изменения качества сборки не имеют никакого эффекта, влияютне показывает использование максимальных настроек качества, сборка для Windows x86_64.

Grayscale.cs

using System;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;

[Serializable]
[PostProcess(typeof(GrayscaleRenderer), PostProcessEvent.AfterStack, "Custom/Grayscale")]
public sealed class Grayscale : PostProcessEffectSettings
{
    [Range(0f, 1f), Tooltip("Grayscale effect intensity.")]
    public FloatParameter blend = new FloatParameter { value = 0.5f };
}

public sealed class GrayscaleRenderer : PostProcessEffectRenderer<Grayscale>
{
    public override void Render(PostProcessRenderContext context)
    {
        var sheet = context.propertySheets.Get(Shader.Find("Hidden/Custom/Grayscale"));
        sheet.properties.SetFloat("_Blend", settings.blend);
        context.command.BlitFullscreenTriangle(context.source, context.destination, sheet, 0);
    }
}

Grayscale.shader

Shader "Hidden/Custom/Grayscale"
{
    HLSLINCLUDE

        #include "Packages/com.unity.postprocessing/PostProcessing/Shaders/StdLib.hlsl"

        TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);
        float _Blend;

        float4 Frag(VaryingsDefault i) : SV_Target
        {
            float4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord);
            float luminance = dot(color.rgb, float3(0.2126729, 0.7151522, 0.0721750));
            color.rgb = lerp(color.rgb, luminance.xxx, _Blend.xxx);
            return color;
        }

    ENDHLSL

    SubShader
    {
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            HLSLPROGRAM

                #pragma vertex VertDefault
                #pragma fragment Frag

            ENDHLSL
        }
    }
}

1 Ответ

1 голос
/ 13 апреля 2019

После долгих проб и ошибок я понял, что это вызвано тем, что Unity исключает скрытый шейдер, так как в нем не было ссылки на что-либо в игре во время сборки.При сборке Unity будет включать только шейдеры, либо прикрепленные к материалу, который используется в сцене, либо к шейдерам, добавленным в настройках проекта в массиве «Always Included Shaders».

Project Settings/Graphics/Always Included Shaders

Я попробовал оба варианта, и это решило мою проблему. Было высказано предположение, что создание в вашей игре фиктивного объекта со ссылкой на скрытый шейдер будет работать лучше, так какон оставляет Unity решать, нужно ли это в сцене или нет.В любом случае это исправило это для меня.

...