首先是效果

这个其实有相当多的地方在说了,我就不嚼舌根了

大概原理:一个Shader两个Pass,第一个Pass不管深度,都渲染,但是不写入深度,第二个Pass几乎没有改动,因为后执行,会覆盖掉第一个Pass本就该渲染的地方(因为第一个Pass没有写入深度),而第一个Pass不该渲染的地方则不会做处理,因为此Pass的深度测试未通过

结合上面那张图来说就是第一个Pass不管模型有没有被绿色遮挡都渲染成全白,因为深度测试都通过,而第二个Pass会进行正常的深度测试,绿色部分是不会通过的,但是被绿色部分遮住以外的部分会通过,那么就覆盖了第一个pass的白色

ps:第二个Pass可以用unity内置的shader替代

 1 // Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
2
3 // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
4
5 Shader "Custom/RoleMaskShader"
6 {
7 Properties
8 {
9 _MainTex ("Texture", 2D) = "white" {}
10 _MainColor("MainColor", COLOR) = (1,1,1,1)
11 _ShadowColor("Color", COLOR) = (1,1,1,1)
12 _DiffuseScale("DiffuseScale", float) = 0.5
13 }
14 SubShader
15 {
16 //Tags { "RenderType"="Opaque" }
17 //LOD 100
18
19 Pass//第一个pass
20 {
21 Tags{"RenderType" = "Transparent" "Queue" = "Transparent"}
22 ZWrite off//关掉深度写入
23 ZTest greater//深度大于的通过,这里直接关掉也行
24 Blend SrcAlpha OneMinusSrcAlpha//混合,必须要开
25 CGPROGRAM
26 #pragma vertex vert
27 #pragma fragment frag
28 #include "UnityCg.cginc"
29
30 v2f_img vert(appdata_base a2v)
31 {
32 v2f_img o;
33 o.pos = UnityObjectToClipPos(a2v.vertex);
34 o.uv = a2v.texcoord;
35 return o;
36 }
37 fixed4 _ShadowColor;
38 fixed4 frag(v2f_img i) : SV_TARGET0
39 {
40 return _ShadowColor;//被挡住可以做描边等等
41 }
42
43 ENDCG
44 }
45 Pass//第二个pass,随意,这里写的是一个halfLambert
46 {
47 Tags{"RenderType" = "Transparent" "Queue" = "Transparent"}
48 CGPROGRAM
49 #pragma vertex vert
50 #pragma fragment frag
51 #include "UnityCg.cginc"
52 #include "Lighting.cginc"
53
54 struct v2f
55 {
56 float4 pos : POSITION;
57 fixed2 uv : TEXCOORD0;
58 float3 normal : TEXCOORD1;
59 };
60
61 v2f vert(appdata_base a2v)
62 {
63 v2f o;
64 o.pos = UnityObjectToClipPos(a2v.vertex);
65 o.uv = a2v.texcoord;
66 o.normal = mul(a2v.normal, (float3x3)unity_WorldToObject).xyz;
67 return o;
68 }
69 fixed4 _MainColor;
70 sampler2D _MainTex;
71 float _DiffuseScale;
72 fixed4 frag(v2f i) : SV_TARGET0
73 {
74 fixed4 texColor = tex2D(_MainTex, i.uv);
75 float halfLambert = saturate(dot(normalize(i.normal), normalize(_WorldSpaceLightPos0.xyz))) * _DiffuseScale + (1 - _DiffuseScale);
76 fixed3 diffuseColor = _LightColor0.rgb * texColor.rgb * halfLambert * _MainColor;
77 return fixed4(diffuseColor, 1);
78 }
79
80 ENDCG
81 }
82 }
83
84 FallBack "VertexLit"//影子,和unity渲染阴影机制有关,shadowCaster
85
86 }

over~废话结束

最新文章

  1. Java被忽略的基本知识(四)
  2. C语言file相关函数学习
  3. IntelliJ Idea14 创建Maven多模块项目
  4. myeclipse10 .jsp将表单提交给.java(form网页与后台通信初识)
  5. CMake with Win&MinGW
  6. UESTC_How many good substrings CDOJ 1026
  7. MongoDB Java Driver 3.4操作
  8. 手写ButterKnife
  9. Roslyn还出现这么低级的错误,不应该呀!
  10. PowerShell工作流学习-1-嵌套工作流和嵌套函数
  11. 5410 ACM 杭电 01+完全背包
  12. shell下的几个命令
  13. 遍历DOM树,链式操作
  14. 重温jsp③
  15. shiro之深度解析FormAuthenticationFilter
  16. SSISDB2:SSIS工程的操作实例
  17. IOS中为tableViewCell增加右侧标记(选中或者更多)
  18. Flink学习笔记:Flink开发环境搭建
  19. 2.C 基础
  20. 〔原创〕Ubuntu Linux Server 9.04 安装全程图解

热门文章

  1. DevSecOps 需要知道的十大 K8s 安全风险及建议
  2. 何为GUI???
  3. [python] Python map函数总结
  4. CFS三层内网靶场
  5. python进阶之路13 二分法 三元表达式 各种生成式 匿名函数
  6. Java学习笔记:2022年1月13日(其一)
  7. MAC中Flutter下载和安装
  8. angular 父组件调用子组件方法---以及组件跨模块使用方法
  9. OpenMP 线程同步 Construct 实现原理以及源码分析(上)
  10. immutable.js 学习笔记(三)----- Map