因为项目里用到renderTexture,发现unity的renderTexture有个问题,就是用透明的RGBA贴图设置的时候,他会将所有的透明通道信息单独拿出来全部做个乘法叠加,depth only的渲染机制导致,会分开存储透明信息。
这个时候的解决办法只能用裁切透明的方式来做一下处理,可以给个权重值,比如大于0.2的不透明度都设置为透明,而且在开启抗锯齿的情况下,这样的opacity Clip也可以过度很柔和了。
SubShader {
Tags {
"Queue"="AlphaTest"
"RenderType"="TransparentCutout"////裁切透明类型
}
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
AlphaToMask On////开启后,可以在MSAA开启的时候,有柔化透明通道边缘作用
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#define UNITY_PASS_FORWARDBASE
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma multi_compile_fog
#pragma only_renderers d3d9 d3d11 glcore gles gles3 metal
#pragma target 3.0
uniform float4 _Color;
struct VertexInput {
float4 vertex : POSITION;
};
struct VertexOutput {
float4 pos : SV_POSITION;
UNITY_FOG_COORDS(0)
};
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.pos = UnityObjectToClipPos( v.vertex );
UNITY_TRANSFER_FOG(o,o.pos);
return o;
}
float4 frag(VertexOutput i) : COLOR {
clip(_Color.a - 0.5);////用clip裁切透明通道
////// Lighting:
float3 finalColor = 0;
fixed4 finalRGBA = fixed4(finalColor,(_Color.a) * 2.0 - 1.0);
UNITY_APPLY_FOG(i.fogCoord, finalRGBA);
return finalRGBA;
}
ENDCG
}