美文网首页
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