jiaozi158 / UnitySSGIURP

Screen Space Global Illumination for Unity URP (Universal Render Pipeline).
MIT License
117 stars 12 forks source link

No GI effect when running at Android (OpenGLES 3.0/3.1) #7

Open sbinunity opened 2 months ago

sbinunity commented 2 months ago

No GI effect when running at Android (OpenGLES 3.0/3.1), maybe I last any preprocess ?

jiaozi158 commented 2 months ago

Hi, thank you for reporting the issue.

Have you modified the shader according to OpenGL Extra Steps mentioned in the README page?

sbinunity commented 2 months ago

Yes, I have done it. I used Unity2022.3.40, URP version is 14.0.11, and the copied Lit shader is as follows: `Shader "Universal Render Pipeline/SSGI_Lit" { Properties { // Specular vs Metallic workflow _WorkflowMode("WorkflowMode", Float) = 1.0

    [MainTexture] _BaseMap("Albedo", 2D) = "white" {}
    [MainColor] _BaseColor("Color", Color) = (1,1,1,1)

    _Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5

    _Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5
    _SmoothnessTextureChannel("Smoothness texture channel", Float) = 0

    _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
    _MetallicGlossMap("Metallic", 2D) = "white" {}

    _SpecColor("Specular", Color) = (0.2, 0.2, 0.2)
    _SpecGlossMap("Specular", 2D) = "white" {}

    [ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0
    [ToggleOff] _EnvironmentReflections("Environment Reflections", Float) = 1.0

    _BumpScale("Scale", Float) = 1.0
    _BumpMap("Normal Map", 2D) = "bump" {}

    _Parallax("Scale", Range(0.005, 0.08)) = 0.005
    _ParallaxMap("Height Map", 2D) = "black" {}

    _OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
    _OcclusionMap("Occlusion", 2D) = "white" {}

    [HDR] _EmissionColor("Color", Color) = (0,0,0)
    _EmissionMap("Emission", 2D) = "white" {}

    _DetailMask("Detail Mask", 2D) = "white" {}
    _DetailAlbedoMapScale("Scale", Range(0.0, 2.0)) = 1.0
    _DetailAlbedoMap("Detail Albedo x2", 2D) = "linearGrey" {}
    _DetailNormalMapScale("Scale", Range(0.0, 2.0)) = 1.0
    [Normal] _DetailNormalMap("Normal Map", 2D) = "bump" {}

    // SRP batching compatibility for Clear Coat (Not used in Lit)
    [HideInInspector] _ClearCoatMask("_ClearCoatMask", Float) = 0.0
    [HideInInspector] _ClearCoatSmoothness("_ClearCoatSmoothness", Float) = 0.0

    // Blending state
    _Surface("__surface", Float) = 0.0
    _Blend("__blend", Float) = 0.0
    _Cull("__cull", Float) = 2.0
    [ToggleUI] _AlphaClip("__clip", Float) = 0.0
    [HideInInspector] _SrcBlend("__src", Float) = 1.0
    [HideInInspector] _DstBlend("__dst", Float) = 0.0
    [HideInInspector] _SrcBlendAlpha("__srcA", Float) = 1.0
    [HideInInspector] _DstBlendAlpha("__dstA", Float) = 0.0
    [HideInInspector] _ZWrite("__zw", Float) = 1.0
    [HideInInspector] _BlendModePreserveSpecular("_BlendModePreserveSpecular", Float) = 1.0
    [HideInInspector] _AlphaToMask("__alphaToMask", Float) = 0.0

    [ToggleUI] _ReceiveShadows("Receive Shadows", Float) = 1.0
    // Editmode props
    _QueueOffset("Queue offset", Float) = 0.0

    // ObsoleteProperties
    [HideInInspector] _MainTex("BaseMap", 2D) = "white" {}
    [HideInInspector] _Color("Base Color", Color) = (1, 1, 1, 1)
    [HideInInspector] _GlossMapScale("Smoothness", Float) = 0.0
    [HideInInspector] _Glossiness("Smoothness", Float) = 0.0
    [HideInInspector] _GlossyReflections("EnvironmentReflections", Float) = 0.0

    [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {}
    [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {}
    [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {}
}

SubShader
{
    // Universal Pipeline tag is required. If Universal render pipeline is not set in the graphics settings
    // this Subshader will fail. One can add a subshader below or fallback to Standard built-in to make this
    // material work with both Universal Render Pipeline and Builtin Unity Pipeline
    Tags
    {
        "RenderType" = "Opaque"
        "RenderPipeline" = "UniversalPipeline"
        "UniversalMaterialType" = "Lit"
        "IgnoreProjector" = "True"
    }
    LOD 300

    // ------------------------------------------------------------------
    //  Forward pass. Shades all light in a single pass. GI + emission + Fog
    Pass
    {
        // Lightmode matches the ShaderPassName set in UniversalRenderPipeline.cs. SRPDefaultUnlit and passes with
        // no LightMode tag are also rendered by Universal Render Pipeline
        Name "ForwardLit"
        Tags
        {
            "LightMode" = "UniversalForward"
        }

        // -------------------------------------
        // Render State Commands
        Blend[_SrcBlend][_DstBlend], [_SrcBlendAlpha][_DstBlendAlpha]
        ZWrite[_ZWrite]
        Cull[_Cull]
        AlphaToMask[_AlphaToMask]

        HLSLPROGRAM
        #pragma target 2.0

        // -------------------------------------
        // Shader Stages
        #pragma vertex LitPassVertex
        #pragma fragment LitPassFragment

        // -------------------------------------
        // Material Keywords
        #pragma shader_feature_local _NORMALMAP
        #pragma shader_feature_local _PARALLAXMAP
        #pragma shader_feature_local _RECEIVE_SHADOWS_OFF
        #pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED
        #pragma shader_feature_local_fragment _SURFACE_TYPE_TRANSPARENT
        #pragma shader_feature_local_fragment _ALPHATEST_ON
        #pragma shader_feature_local_fragment _ _ALPHAPREMULTIPLY_ON _ALPHAMODULATE_ON
        #pragma shader_feature_local_fragment _EMISSION
        #pragma shader_feature_local_fragment _METALLICSPECGLOSSMAP
        #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
        #pragma shader_feature_local_fragment _OCCLUSIONMAP
        #pragma shader_feature_local_fragment _SPECULARHIGHLIGHTS_OFF
        #pragma shader_feature_local_fragment _ENVIRONMENTREFLECTIONS_OFF
        #pragma shader_feature_local_fragment _SPECULAR_SETUP

        // -------------------------------------
        // Universal Pipeline keywords
        #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN
        #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
        #pragma multi_compile _ EVALUATE_SH_MIXED EVALUATE_SH_VERTEX
        #pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS
        #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING
        #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION
        #pragma multi_compile_fragment _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH
        #pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION
        #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3
        #pragma multi_compile_fragment _ _LIGHT_COOKIES
        #pragma multi_compile _ _LIGHT_LAYERS
        #pragma multi_compile _ _FORWARD_PLUS
        #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl"
        #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl"

        // -------------------------------------
        // Unity defined keywords
        #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING
        #pragma multi_compile _ SHADOWS_SHADOWMASK
        #pragma multi_compile _ DIRLIGHTMAP_COMBINED
        #pragma multi_compile _ LIGHTMAP_ON
        #pragma multi_compile _ DYNAMICLIGHTMAP_ON
        #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE
        #pragma multi_compile_fog
        #pragma multi_compile_fragment _ DEBUG_DISPLAY

        //--------------------------------------
        // GPU Instancing
        #pragma multi_compile_instancing
        #pragma instancing_options renderinglayer
        #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"

        #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
        #include "Packages/com.unity.render-pipelines.universal/Shaders/LitForwardPass.hlsl"
        ENDHLSL
    }

    Pass
    {
        Name "ShadowCaster"
        Tags
        {
            "LightMode" = "ShadowCaster"
        }

        // -------------------------------------
        // Render State Commands
        ZWrite On
        ZTest LEqual
        ColorMask 0
        Cull[_Cull]

        HLSLPROGRAM
        #pragma target 2.0

        // -------------------------------------
        // Shader Stages
        #pragma vertex ShadowPassVertex
        #pragma fragment ShadowPassFragment

        // -------------------------------------
        // Material Keywords
        #pragma shader_feature_local _ALPHATEST_ON
        #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A

        //--------------------------------------
        // GPU Instancing
        #pragma multi_compile_instancing
        #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"

        // -------------------------------------
        // Universal Pipeline keywords

        // -------------------------------------
        // Unity defined keywords
        #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE

        // This is used during shadow map generation to differentiate between directional and punctual light shadows, as they use different formulas to apply Normal Bias
        #pragma multi_compile_vertex _ _CASTING_PUNCTUAL_LIGHT_SHADOW

        // -------------------------------------
        // Includes
        #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
        #include "Packages/com.unity.render-pipelines.universal/Shaders/ShadowCasterPass.hlsl"
        ENDHLSL
    }

    Pass
    {
        // Lightmode matches the ShaderPassName set in UniversalRenderPipeline.cs. SRPDefaultUnlit and passes with
        // no LightMode tag are also rendered by Universal Render Pipeline
        Name "GBuffer"
        Tags
        {
            "LightMode" = "UniversalGBuffer"
        }

        // -------------------------------------
        // Render State Commands
        ZWrite[_ZWrite]
        ZTest LEqual
        Cull[_Cull]

        HLSLPROGRAM
       // #pragma target 4.5

        // Deferred Rendering Path does not support the OpenGL-based graphics API:
        // Desktop OpenGL, OpenGL ES 3.0, WebGL 2.0.
      //  #pragma exclude_renderers gles3 glcore

        // -------------------------------------
        // Shader Stages
        #pragma vertex LitGBufferPassVertex
        #pragma fragment LitGBufferPassFragment

        // -------------------------------------
        // Material Keywords
        #pragma shader_feature_local _NORMALMAP
        #pragma shader_feature_local_fragment _ALPHATEST_ON
        //#pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON
        #pragma shader_feature_local_fragment _EMISSION
        #pragma shader_feature_local_fragment _METALLICSPECGLOSSMAP
        #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
        #pragma shader_feature_local_fragment _OCCLUSIONMAP
        #pragma shader_feature_local _PARALLAXMAP
        #pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED

        #pragma shader_feature_local_fragment _SPECULARHIGHLIGHTS_OFF
        #pragma shader_feature_local_fragment _ENVIRONMENTREFLECTIONS_OFF
        #pragma shader_feature_local_fragment _SPECULAR_SETUP
        #pragma shader_feature_local _RECEIVE_SHADOWS_OFF

        // -------------------------------------
        // Universal Pipeline keywords
        #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN
        //#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
        //#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
        #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING
        #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION
        #pragma multi_compile_fragment _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH
        #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3
        #pragma multi_compile_fragment _ _RENDER_PASS_ENABLED
        #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl"

        // -------------------------------------
        // Unity defined keywords
        #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING
        #pragma multi_compile _ SHADOWS_SHADOWMASK
        #pragma multi_compile _ DIRLIGHTMAP_COMBINED
        #pragma multi_compile _ LIGHTMAP_ON
        #pragma multi_compile _ DYNAMICLIGHTMAP_ON
        #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE
        #pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT

        //--------------------------------------
        // GPU Instancing
        #pragma multi_compile_instancing
        #pragma instancing_options renderinglayer
        #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"

        // -------------------------------------
        // Includes
        #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
        #include "Packages/com.unity.render-pipelines.universal/Shaders/LitGBufferPass.hlsl"
        ENDHLSL
    }

    Pass
    {
        Name "DepthOnly"
        Tags
        {
            "LightMode" = "DepthOnly"
        }

        // -------------------------------------
        // Render State Commands
        ZWrite On
        ColorMask R
        Cull[_Cull]

        HLSLPROGRAM
        #pragma target 2.0

        // -------------------------------------
        // Shader Stages
        #pragma vertex DepthOnlyVertex
        #pragma fragment DepthOnlyFragment

        // -------------------------------------
        // Material Keywords
        #pragma shader_feature_local _ALPHATEST_ON
        #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A

        // -------------------------------------
        // Unity defined keywords
        #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE

        //--------------------------------------
        // GPU Instancing
        #pragma multi_compile_instancing
        #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"

        // -------------------------------------
        // Includes
        #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
        #include "Packages/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl"
        ENDHLSL
    }

    // This pass is used when drawing to a _CameraNormalsTexture texture
    Pass
    {
        Name "DepthNormals"
        Tags
        {
            "LightMode" = "DepthNormals"
        }

        // -------------------------------------
        // Render State Commands
        ZWrite On
        Cull[_Cull]

        HLSLPROGRAM
        #pragma target 2.0

        // -------------------------------------
        // Shader Stages
        #pragma vertex DepthNormalsVertex
        #pragma fragment DepthNormalsFragment

        // -------------------------------------
        // Material Keywords
        #pragma shader_feature_local _NORMALMAP
        #pragma shader_feature_local _PARALLAXMAP
        #pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED
        #pragma shader_feature_local _ALPHATEST_ON
        #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A

        // -------------------------------------
        // Unity defined keywords
        #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE

        // -------------------------------------
        // Universal Pipeline keywords
        #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl"

        //--------------------------------------
        // GPU Instancing
        #pragma multi_compile_instancing
        #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"

        // -------------------------------------
        // Includes
        #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
        #include "Packages/com.unity.render-pipelines.universal/Shaders/LitDepthNormalsPass.hlsl"
        ENDHLSL
    }

    // This pass it not used during regular rendering, only for lightmap baking.
    Pass
    {
        Name "Meta"
        Tags
        {
            "LightMode" = "Meta"
        }

        // -------------------------------------
        // Render State Commands
        Cull Off

        HLSLPROGRAM
        #pragma target 2.0

        // -------------------------------------
        // Shader Stages
        #pragma vertex UniversalVertexMeta
        #pragma fragment UniversalFragmentMetaLit

        // -------------------------------------
        // Material Keywords
        #pragma shader_feature_local_fragment _SPECULAR_SETUP
        #pragma shader_feature_local_fragment _EMISSION
        #pragma shader_feature_local_fragment _METALLICSPECGLOSSMAP
        #pragma shader_feature_local_fragment _ALPHATEST_ON
        #pragma shader_feature_local_fragment _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
        #pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED
        #pragma shader_feature_local_fragment _SPECGLOSSMAP
        #pragma shader_feature EDITOR_VISUALIZATION

        // -------------------------------------
        // Includes
        #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
        #include "Packages/com.unity.render-pipelines.universal/Shaders/LitMetaPass.hlsl"

        ENDHLSL
    }

    Pass
    {
        Name "Universal2D"
        Tags
        {
            "LightMode" = "Universal2D"
        }

        // -------------------------------------
        // Render State Commands
        Blend[_SrcBlend][_DstBlend]
        ZWrite[_ZWrite]
        Cull[_Cull]

        HLSLPROGRAM
        #pragma target 2.0

        // -------------------------------------
        // Shader Stages
        #pragma vertex vert
        #pragma fragment frag

        // -------------------------------------
        // Material Keywords
        #pragma shader_feature_local_fragment _ALPHATEST_ON
        #pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON

        #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"

        // -------------------------------------
        // Includes
        #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
        #include "Packages/com.unity.render-pipelines.universal/Shaders/Utils/Universal2D.hlsl"
        ENDHLSL
    }
}

FallBack "Hidden/Universal Render Pipeline/FallbackError"
CustomEditor "UnityEditor.Rendering.Universal.ShaderGUI.LitShader"

} `

sbinunity commented 2 months ago

After I changed the rendering path to defferred, there was a GI on my android phone, but the performance was extremely poor. On my Qualcomm 7th generation phone, the FPS was only 6 frames per second, and it seemed that the GI result was not quite correct. Is there any way to optimize the FPS to around 30?

jiaozi158 commented 2 months ago

Thank you for the info, I will look into this later.

jiaozi158 commented 2 months ago

Hi, I‘ve spent some time updating the repository. Could you try and see if SSGI (1.0.6) works fine on your device?

Regarding performance, you may refer to the settings below: SSGI_Low_Quality

The performance cost of SSGI is related to the rendering resolution (ex. render scale in URP), and mobile devices usually have small screens with high resolutions. I will continue to improve performance in future releases.

sbinunity commented 2 months ago

I updated to 1.0.7, but Forward and Forward+did not work on Android. Only the Deffered path worked, but after running for a few seconds, it crashed and exited image image

sbinunity commented 2 months ago

I modified the option to test the reason for the crash and obtained this option. image

In addition, when the free force can run up to 30fps, the quality of the entire screen is already too low to be acceptable

jiaozi158 commented 2 months ago

I updated to 1.0.7, but Forward and Forward+did not work on Android.

Can you try adding a Deferred renderer to the renderer list and test it again? Add_Deferred_Renderer

This should be done by the script KeepDeferredVariantsEditor.cs during the build, but I'm not sure why it didn't work.

Since URP doesn't support Deferred rendering on OpenGL APIs, this may be the cause of the crash. Please let me know if it still crashes on Forward(+).

jiaozi158 commented 2 months ago

I modified the option to test the reason for the crash and obtained this option.

That makes sense because Backface Lighting renders the back-face of scene geometries using the Forward(+) path, which can cause issues when using Deferred path.

Thank you for reporting this, I’ll fix it ASAP.

jiaozi158 commented 2 months ago

Hey, just in case you are still trying to use this solution.

You may try the following settings to see if you can achieve an acceptable frame rate on the device:

Hope this helps!