在制作外发光时候收到一个需求,期望模型透明时不显示背面但是旋转后可以看到背面模型,做了背面剔除并开启深度效果不是很理想,下面是我找到的两种处理方法.
期望不显示拳头背面的手指 ,模型旋转后完整显示手指
方法1
添加一个pass储存深度 开启ColorMask
Pass{
Cull Off
Zwrite On
ColorMask 0
HLSLPROGRAM
float4 _EdgeColor;
#pragma vertex Vertex
#pragma fragment Fragment
#include "Packages/com.unity.renderpipelines.lightweight/Shaders/Core.hlsl
float4 Vertex(float4 vertexPos : POSITION):SV_POSITION
{
return TransformWorldToHClip(TransformObjectToWorld(vertexPos));
}
half4 Fragment(void): COLOR
{
return _EdgeColor;
}
ENDHLSL
}
方案二
用颜色遮罩贴图,遮住手指部分,再构建矩阵判断世界坐标位置,根据位置给遮罩贴图乘区间值
//通过当前的相机空间坐标构建矩阵,判断当前方向
half3 back = TransformWorldToView(TransformObjectToWorld(float4(1, 0, 0, 0))).xyz;
float blendFactor = 1 - (dot(float3(1, 0, 0), back.xyz) + 1) * 0.5;
//遮罩贴图(我使用的是g通道)
half4 maskMap = SAMPLE_TEXTURE2D(_EmissionTex, sampler_EmissionTex, input.uv.zw);
half4 Color;
Color.a = saturate(lerp(1, maskMap.g, blendFactor));
效果如下
正面不显示手指,启用贴图遮罩;
旋转模型后关闭(乘0)贴图遮罩显示手指;
仅遮罩未做矩阵计算
达到效果