Unity后处理PostProcessEffectRenderer在编辑器中显示但在构建中未显示。

6

在将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个回答

3
经过多次尝试,我意识到这是由于Unity在构建时排除了隐藏的着色器,因为它缺少与游戏中任何内容的引用。在构建时,Unity只会包含附加到场景中使用的材质或添加到“始终包含的着色器”数组中的着色器。

Project Settings/Graphics/Always Included Shaders

我尝试了两种方法,都解决了我的问题。有人建议在游戏中创建一个虚拟对象,引用隐藏的着色器会更好,因为这样可以让Unity决定是否需要在场景中使用它。无论如何,这对我来说都解决了问题。

你可能会认为现在你知道它永远不会再发生了,对吧?不,总有一天你会忘记并重新经历整个过程来找出答案。 :) - Retired Ninja
是的!是的!我欠你一个饼干,或者一杯咖啡,或者什么东西,总有一天。我快疯了。非常感谢你! - Damián Pablo González

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接