美文网首页
Unity中投影器Projector投射贴图不受被投射物体颜色影

Unity中投影器Projector投射贴图不受被投射物体颜色影

作者: Kasug | 来源:发表于2019-02-26 17:53 被阅读0次

    本文旨在实现以下效果


    1.png

    没错,就是贴图的颜色不会和底图的红色叠加~

    直接上代码:

    
    Properties {
    
    _ShadowTex ("Cookie", 2D) = "gray" {}
    
    }
    
    Subshader {
    
    Tags {"Queue"="Transparent"}
    
    Pass {
    
    blend srcAlpha oneMinusSrcAlpha
    
    CGPROGRAM
    
    #pragma vertex vert
    
    #pragma fragment frag
    
    #pragma multi_compile_fog
    
    #include "UnityCG.cginc"
    
    struct v2f {
    
    float4 uvShadow : TEXCOORD0;
    
    float4 pos : SV_POSITION;
    
    };
    
    float4x4 unity_Projector;
    
    float4x4 unity_ProjectorClip;
    
    v2f vert (float4 vertex : POSITION)
    
    {
    
    v2f o;
    
    o.pos = UnityObjectToClipPos(vertex);
    
    o.uvShadow = mul (unity_Projector, vertex);
    
    return o;
    
    }
    
    sampler2D _ShadowTex;
    
    fixed4 frag (v2f i) : SV_Target
    
    {
    
    fixed4 texS;
    
    if(i.uvShadow.x >= 0.01 && i.uvShadow.x<= 0.99
    
    && i.uvShadow.y  >= 0.01 && i.uvShadow.y <= 0.99){
    
    texS = tex2Dproj(_ShadowTex,UNITY_PROJ_COORD(i.uvShadow));
    
    }else{
    
    texS = fixed4(1,1,1,0);
    
    }
    
    return texS;
    
    }
    
    ENDCG
    
    }
    
    

    其中最重要的就是blend srcAlpha oneMinusSrcAlpha和片元着色器中的else。

    这里的else规定了uv不在0.01~0.09范围的其他地方颜色值均为fixed4(1,1,1,0)。

    由于Blend SrcFactor DstFactor (SrcFactor是源系数,DstFactor是目标系数)

    最终颜色 = (Shader计算出的点颜色值 *源系数)+(点累积颜色 * 目标系数)

    而Blend SrcAlpha OneMinusSrcAlpha 表示正常模式(透明度混合)

    具体blend实例请看

    https://blog.csdn.net/wdsdsdsds/article/details/52535352

    可以得出采样范围内的颜色就是它自身的颜色,而范围外的都是透明,所以不会覆盖底图的红色

    相关文章

      网友评论

          本文标题:Unity中投影器Projector投射贴图不受被投射物体颜色影

          本文链接:https://www.haomeiwen.com/subject/qblzyqtx.html