Shader does not work under LWRP but does not throw any errors

Hi,

I have a vert/frag shader that does not use any surf calls, so should work in LWRP but is not. It also doesn’t throw any errors. How would one recommend investigating it?

Material 5218538--519977--upload_2019-11-27_9-16-16.png
In Scene (should be transparent, but is gray, yet not pink) 5218538--519980--upload_2019-11-27_9-16-52.png

Shader Code

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "QFSW/Blur"
{
    Properties
    {
        _Color("Main Color", Color) = (1,1,1,1)
        _MainTex("Tint Color (RGB)", 2D) = "white" {}
        _Radius("Radius", Range(0, 20)) = 1
    }

    Category
    {

    Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Opaque" }
    SubShader{

    GrabPass{
    Tags{ "LightMode" = "Always" }
    }
    Pass{
    Tags{ "LightMode" = "Always" }

    CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"

    struct appdata_t
    {
        float4 vertex : POSITION;
        float2 texcoord: TEXCOORD0;
        fixed4 color : COLOR;
    };

    struct v2f
    {
        float4 vertex : POSITION;
        float4 uvgrab : TEXCOORD0;
        fixed4 color : COLOR;
    };

    v2f vert(appdata_t v)
    {
        v2f o;
        o.vertex = UnityObjectToClipPos(v.vertex);
#if UNITY_UV_STARTS_AT_TOP
        float scale = -1.0;
#else
        float scale = 1.0;
#endif
        o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
        o.uvgrab.zw = o.vertex.zw;
        o.color = v.color;
        return o;
    }

    sampler2D _GrabTexture;
    float4 _GrabTexture_TexelSize;
    uniform float _Radius;
    uniform float _BlurMultiplier = 1;

    half4 frag(v2f i) : COLOR
    {
        _Radius *= _BlurMultiplier;
        _Radius *= i.color.a;
        half4 sum = half4(0,0,0,0);
#define GRABPIXEL(weight, kernelx) tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x + _GrabTexture_TexelSize.x * kernelx * _Radius, i.uvgrab.y, i.uvgrab.z, i.uvgrab.w))) * weight
        sum += GRABPIXEL(0.05, -4.0);
        sum += GRABPIXEL(0.09, -3.0);
        sum += GRABPIXEL(0.12, -2.0);
        sum += GRABPIXEL(0.15, -1.0);
        sum += GRABPIXEL(0.18,  0.0);
        sum += GRABPIXEL(0.15, +1.0);
        sum += GRABPIXEL(0.12, +2.0);
        sum += GRABPIXEL(0.09, +3.0);
        sum += GRABPIXEL(0.05, +4.0);

        return sum;
    }
        ENDCG
    }

    GrabPass
    {
        Tags{ "LightMode" = "Always" }
    }
    Pass{
        Tags{ "LightMode" = "Always" }

        CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"

        struct appdata_t
        {
            float4 vertex : POSITION;
            float2 texcoord: TEXCOORD0;
            fixed4 color : COLOR;
        };

    struct v2f {
        float4 vertex : POSITION;
        float4 uvgrab : TEXCOORD0;
        fixed4 color : COLOR;
    };

    v2f vert(appdata_t v) {
        v2f o;
        o.vertex = UnityObjectToClipPos(v.vertex);
#if UNITY_UV_STARTS_AT_TOP
        float scale = -1.0;
#else
        float scale = 1.0;
#endif
        o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
        o.uvgrab.zw = o.vertex.zw;
        o.color = v.color;
        return o;
    }

    sampler2D _GrabTexture;
    float4 _GrabTexture_TexelSize;
    uniform float _Radius;
    uniform float _BlurMultiplier = 1;

    half4 frag(v2f i) : COLOR{
        _Radius *= _BlurMultiplier;
        _Radius *= i.color.a;
        half4 sum = half4(0,0,0,0);
#define GRABPIXEL(weight,kernely) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x, i.uvgrab.y + _GrabTexture_TexelSize.y * kernely*_Radius, i.uvgrab.z, i.uvgrab.w))) * weight

        sum += GRABPIXEL(0.05, -4.0);
        sum += GRABPIXEL(0.09, -3.0);
        sum += GRABPIXEL(0.12, -2.0);
        sum += GRABPIXEL(0.15, -1.0);
        sum += GRABPIXEL(0.18,  0.0);
        sum += GRABPIXEL(0.15, +1.0);
        sum += GRABPIXEL(0.12, +2.0);
        sum += GRABPIXEL(0.09, +3.0);
        sum += GRABPIXEL(0.05, +4.0);

        return sum;
    }
        ENDCG
    }

        GrabPass{
        Tags{ "LightMode" = "Always" }
    }
        Pass{
        Tags{ "LightMode" = "Always" }

        CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"

        struct appdata_t {
        float4 vertex : POSITION;
        float2 texcoord: TEXCOORD0;
    };

    struct v2f
    {
        float4 vertex : POSITION;
        float4 uvgrab : TEXCOORD0;
        float2 uvmain : TEXCOORD1;
    };

    float4 _MainTex_ST;

    v2f vert(appdata_t v) {
        v2f o;
        o.vertex = UnityObjectToClipPos(v.vertex);
#if UNITY_UV_STARTS_AT_TOP
        float scale = -1.0;
#else
        float scale = 1.0;
#endif
        o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
        o.uvgrab.zw = o.vertex.zw;
        o.uvmain = TRANSFORM_TEX(v.texcoord, _MainTex);
        return o;
    }

    fixed4 _Color;
    sampler2D _GrabTexture;
    float4 _GrabTexture_TexelSize;
    sampler2D _MainTex;

    half4 frag(v2f i) : COLOR
    {
        half4 col = tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(i.uvgrab));
        half4 tint = tex2D(_MainTex, i.uvmain) * _Color;

        return col * tint;
    }
        ENDCG
    }
    }
    }
}

Hey,

So this shader does indeed look like it is rendering as expected, there are two things I see here, first is the material preview being pink is probably down to a caching issue and reimporting the material should re-generate a correct thumbnail.
The second issue is that you are using GrabPass throughout the shader which is not supported in LWRP(Universal RP) this has been superseded by the CameraOpaqueTexture for efficiency sakes.

Here I assume you are wanting to create a UI that blurs the rendering behind it? if so @Andy-Touch created a nice example in our renderer examples here, it is not quite finished up but works and shows the idea.

1 Like

Does CameraOpaqueTexture work in standard and earlier versions of Unity? Or will I need two versions of the shader?

And yes this is what I am doing, here is how it looks without an SRP in use
5219141--520079--upload_2019-11-27_12-17-16.png