呈现透明而不是颜色的着色器

时间:2017-07-07 15:10:23

标签: unity3d shader

我对着色器完全不熟悉,我从未做过一个

我想知道是否有可能使用着色器呈现通常不亮的纹理,除了特定的颜色,应该呈现为透明

有点像绿屏,我想让着色器渲染rgba(0,0,0,0)而不是rgba(0,1,0,1)

我知道我可以使用带有alpha的纹理,但我需要这个用于移动设备上的视频纹理,所以我认为这是唯一的选择

提前感谢您提供的任何提示或答案

1 个答案:

答案 0 :(得分:3)

您正在寻找色度键着色器。

this Unity forum thread中有一些细节,我认为这个会做你所要求的,虽然另一个解决方案可能会“更好”,具体取决于你可以对你的视频源做些什么,等等。如果可以的话,给你读一下。

Shader "Matte/RGB Color"
{

Properties {
   _MainTex ("Base (RGB)", 2D) = "white" {}
   _Matte ("Matte Color", Color) = (1,0,1,1)
   _Thresh ("Threshold", Range (0,1)) = 0.0
   _Cutoff ("Cutoff", Range (0,1)) = .5
}

SubShader {

   Pass {
      AlphaTest Less [_Cutoff]
CGPROGRAM
#pragma fragment frag
#include "UnityCG.cginc"

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

sampler2D _MainTex;
uniform half4 _Matte;
uniform float _Thresh;
uniform float _Cutoff;

half4 frag (v2f i) : COLOR
{
    //return _Matte;
    half4 color = tex2D(_MainTex, i.uv.xy);

    half3 keyMinus = half3( (_Matte.r - _Thresh), (_Matte.g - _Thresh), (_Matte.b - _Thresh) );
    half3 keyPlus = half3( (_Matte.r + _Thresh), (_Matte.g + _Thresh), (_Matte.b + _Thresh) );

    if ( ((color.r > keyMinus.r)  (color.r < keyPlus.r))  ((color.g > keyMinus.g)  (color.g < keyPlus.g))  ((color.b > keyMinus.b)  (color.b < keyPlus.b)) )
    {
        return _Cutoff;
    }

    return float4(color.rgb, max(0, _Cutoff-0.01));
}

ENDCG
      } // pass
   } // subshader
   //Fallback "Transparent/Diffuse"
} // shader

资产商店也有资产,例如this one(8美元),可能效果更好,也可能没有。