user6038900
user6038900

Reputation:

Using custom shader results in black image

I use unity 2018.3.5f1. I would like to overlay a custom shader while rendering an image. Following is my onRenderImage Function.

void OnRenderImage(RenderTexture src, RenderTexture dest) {
        // shaderMaterial renders the image with Barrel distortion and disparity effect
        Graphics.Blit(camTextureHolder.mainTexture, nullRenderTexture, shaderMaterial);

        // measure average frames per second
        m_FpsAccumulator++;
        if (Time.realtimeSinceStartup > m_FpsNextPeriod) {
            m_CurrentFps = (int)(m_FpsAccumulator / fpsMeasurePeriod);
            m_FpsAccumulator = 0;
            m_FpsNextPeriod += fpsMeasurePeriod;
        }
    }

The issue is that the entire screen appears to be black while I'm trying to do so. May I know how do I fix this issue?

Update:

This is the code for the shader that I'm using

Shader "Custom/FakeAR"
{
    Properties{
        _MainTex("", 2D) = "white" {}
        [HideInInspector]_FOV("FOV", Range(1, 2)) = 1.6
        [HideInInspector]_Disparity("Disparity", Range(0, 0.3)) = 0.1
        [HideInInspector]_Alpha("Alpha", Range(0, 2.0)) = 1.0
    }

SubShader{

    Pass{
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        struct v2f {
            float4 pos : POSITION;
            float2 uv : TEXCOORD0;
        };

        // Default Vertex Shader 
        v2f vert(appdata_img v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex);
            o.uv = MultiplyUV(UNITY_MATRIX_TEXTURE0, v.texcoord.xy);
            return o;
        }

        // Parameters
        sampler2D _MainTex;
        float _FOV;

        // Alpha is the ratio of pixel density: width to height
        float _Alpha;
        // Disparity is the portion to separate
        // larger disparity cause closer stereovision
        float _Disparity;


        // Fragment Shader: Remap the texture coordinates to combine
        // barrel distortion and disparity video display
        fixed4 frag(v2f i) : COLOR {
            float2 uv1, uv2, uv3;
            float t1, t2;
            float offset;

            // uv1 is the remap of left and right screen to a full screen 
            uv1 = i.uv - 0.5;
            uv1.x = uv1.x * 2 - 0.5 + sign(i.uv.x < 0.5);

            t1 = sqrt(1.0 - uv1.x * uv1.x - uv1.y * uv1.y);
            t2 = 1.0 / (t1 * tan(_FOV * 0.5));

            // uv2 is the remap of side screen with barrel distortion
            uv2 = uv1 * t2 + 0.5;

            // black color for out-of-range pixels
            if (uv2.x >= 1 || uv2.y >= 1 || uv2.x <= 0 || uv2.y <= 0) {
                return fixed4(0, 0, 0, 1);
            }
            else {
                offset = 0.5 - _Alpha * 0.5 + _Disparity * 0.5 - _Disparity * sign(i.uv.x < 0.5);
                // uv3 is the remap of image texture
                uv3 = uv2;
                uv3.x = uv2.x * _Alpha + offset;
                return tex2D(_MainTex, uv3);
            }               
        }
        ENDCG
    }
}
FallBack "Diffuse"

}

Is it because of the shader?

Upvotes: 7

Views: 3285

Answers (1)

Dimitri
Dimitri

Reputation: 119

Well I think it's working it's just that the shader has nothing to render meaning it goes for black. You might want the shader to use the excisting camera texture. So maybe this?

void OnRenderImage(RenderTexture src, RenderTexture dest) {
        // shaderMaterial renders the image with Barrel distortion and disparity effect
        Graphics.Blit(src, dst, shaderMaterial);

        // measure average frames per second
        m_FpsAccumulator++;
        if (Time.realtimeSinceStartup > m_FpsNextPeriod) {
            m_CurrentFps = (int)(m_FpsAccumulator / fpsMeasurePeriod);
            m_FpsAccumulator = 0;
            m_FpsNextPeriod += fpsMeasurePeriod;
        }
    }

Try making the shader really default and see if it renders something. So try a shader that looks like this:

Shader "Examples/ExampleDisplacement"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
    }
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;

            float4 frag (v2f i) : SV_Target
            {
                float4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG
        }
    }
}

Upvotes: 5

Related Questions