Как обрезать WebcamTexture с помощью шейдера? - PullRequest
0 голосов
/ 18 декабря 2018

У меня шейдер кеинга отлично работает в Unity 2018.3.Мне нужно добавить верхний, нижний, левый, правый свойства к шейдеру и использовать эти параметры, чтобы сделать ненужные части текстуры прозрачными.Вот изображение, полученное из текстуры;

chromakey

Весь процесс должен быть выполнен в шейдере, так как это веб-камера и GetPixels(), SetPixels() из mainTexture в Update() очень дорого.

Вот мой код шейдера:

shader "Custom/chroma"

{

Properties{
        _MainTex("Base (RGB)", 2D) = "white" {}
        _MaskCol("Mask Color", Color) = (1.0, 0.0, 0.0, 1.0)
        _Sensitivity("Threshold Sensitivity", Range(0,1)) = 0.5
        _Smooth("Smoothing", Range(0,1)) = 0.5
        _Top("Top", Range(0,1)) = 0
        _Bottom("Bottom", Range(0,1)) = 0
        _Left("Left", Range(0,1)) = 0
        _Right("Right", Range(0,1)) = 0
}
    SubShader{
            Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent"}
            LOD 100
             Lighting Off
             ZWrite Off
              AlphaTest Off
             Blend SrcAlpha OneMinusSrcAlpha

            CGPROGRAM
            #pragma surface surf Lambert alpha

            struct Input {
                float2 uv_MainTex;
                float4 screenPos;
                float3 worldPos;
            };

            sampler2D _MainTex;
            float4 _MaskCol;
            float _Sensitivity;
            float _Smooth;
            float _Top;
            float _Bottom;
            float _Left;
            float _Right;


            void surf(Input IN, inout SurfaceOutput o) {
                    half4 c = tex2D(_MainTex, IN.uv_MainTex);

                    float maskY = 0.2989 * _MaskCol.r + 0.5866 * _MaskCol.g + 0.1145 * _MaskCol.b;
                    float maskCr = 0.7132 * (_MaskCol.r - maskY);
                    float maskCb = 0.5647 * (_MaskCol.b - maskY);

                    float Y = 0.2989 * c.r + 0.5866 * c.g + 0.1145 * c.b;
                    float Cr = 0.7132 * (c.r - Y);
                    float Cb = 0.5647 * (c.b - Y);

                    float d = abs(length(abs(float2(Cr, Cb) - float2(maskCr, maskCb))));
                    float edge0 = _Sensitivity * (1 - _Smooth);
                    float alpha = smoothstep(edge0, _Sensitivity, d);

                    if (IN.uv_MainTex.x<_Left || IN.uv_MainTex.x>(1-_Right))
                    {
                        alpha = 0;
                    };
                    if (IN.uv_MainTex.y<_Bottom || IN.uv_MainTex.y>(1 - _Top))
                    {
                        alpha = 0;
                    };

                    o.Alpha = alpha * 1;
                    o.Emission = c.rgb * alpha;

            }
            ENDCG

        }
            FallBack "Unlit/Texture"

}

1 Ответ

0 голосов
/ 18 декабря 2018

IN.uv_MainTex содержит ваше нормализованное положение экрана.

if (IN.uv_MainTex.x<0.3||IN.uv_MainTex.x>0.8) return float4(0,0,0,0);

обрежет ваше изображение до прозрачности вне диапазона 0,3-0,8 - вы можете сделать то же самое для y и параметризовать оба через свойства материала

...