首先是效果

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

大概原理:一个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~废话结束

[UnityShader]说厌了的遮挡显示的更多相关文章

  1. 解决bootstrap-table表头filter-control select控件被遮挡显示不全的问题

    [本文出自天外归云的博客园] 在使用bootstrap-table的extension——filter-control时(对应表格的data-filter-control="true&quo ...

  2. 终于懂了:FWinControls子控件的显示是由Windows来管理,而不是由Delphi来管理(显示透明会导致计算无效区域的方式有所不同——透明的话应减少剪裁区域,所以要进行仔细计算)

    在研究TCustomControl的显示过程中,怎么样都找不到刷新FWinControls并重新显示的代码: procedure TWinControl.PaintHandler(var Messag ...

  3. UnityShader学习笔记- Stencil Buffer

    模板测试(Stencil Test)是现代渲染流水线的一环,其中涉及到的就是模板缓冲(Stencil Buffer),模板缓冲可以用来制作物体的遮罩.轮廓描边.阴影.遮挡显示等等效果 目录 Stenc ...

  4. 关于android初学者必须掌握的Activity的四大知识点

    这几天一直都在捣鼓android的知识点,兴趣班的老师,讲课太过深奥,天(想到什么就见什么,后后面完全不想听),最后自己找资料总结了在Android学习中很重要的一个组件Activity,那就开始吧! ...

  5. APICloud上openFrameGroup把菜单挡住了,怎么处理?

    问:openFrameGroup把菜单挡住了,怎么处理? 试了sendFrameToBack没反应,又不能页面自己openFrameGroup,不知道该怎么办.而且用另外的页面先openFrameGr ...

  6. 更换jupyter notebook风格主题、修改默认工作路径(Ubuntu系统和Win系统)

    默认的风格对代码关键词的颜色提醒很不明显,而且白色背景长久使用非常刺眼,所以考虑更换主题. 在更换途中,发现代码输出行,前几个字符被遮挡显示不出来,找了很久才解决,备忘一些要点. 1:替换主题方法 h ...

  7. web@h,c小总结

    问题0:元素内联元素,行内元素,行内块元素.        内联: 宽高M,P都有效        行内元素:无宽高,内容撑开,M,P左右有效        行内块元素:可设宽高,内容撑开,M,P都有 ...

  8. unity3d: how to display the obj behind the wall

    透墙显示,遮挡显示,使用ztest Tags { "Queue"="Overlay+1" "RenderType"="Transp ...

  9. iOS11 与 iPhone X适配的那些坑(持更中...)

    目录 问题列表 1.适配iPhoneX 屏幕原则 2.适配过程一些常量的设置 3..iPhone X 上运行有黑色区域问题 4.iOS11导航栏适配 5.出现UIScrollview 漂移问题(基本都 ...

  10. 安卓记账本开发学习day6之进度

    完成了基本的收入与支出添加,支持输入备注 以及备注的输入和金额的遮挡显示切换

随机推荐

  1. Django简介以及基本使用

    目录 Django简介以及基本使用 一.django简介 1.web框架的本质是什么 ? 2.python主流web框架有那些 ? 3.web框架的推导过程 二.基本使用 1.运行django注意事项 ...

  2. java RSA加密

    参考了下面这个博主的文章,很有收获,简单处理后记录一下 RSA加密.解密.签名.验签的原理及方法 - PC君 - 博客园 工具类自带生成秘钥的方法,也可以用第三方工具生成秘钥 package com. ...

  3. iOS 使用xcode11新建项目

    1. 首先打开Xcode11,然后使用command + shift + n 快捷键创建一个新的工程 选择 Single View App   完成之后点击next 2. 会弹出 Choose opt ...

  4. Svelte框架实现表格协同文档

    首先,从框架搭建上,本篇示例采用当下流行的前后端分离的开发方式,前端使用npm作为脚手架搭建Svelte框架. 后端使用Java的SpringBoot作为后端框架. 首先,介绍下在前端Svelte框架 ...

  5. WeetCode4 —— 二叉树遍历与树型DP

    一丶二叉树的遍历 1.二叉树遍历递归写法与递归序 了解过二叉树的朋友,最开始肯定是从二叉树的遍历开始的,二叉树遍历的递归写法想必大家都有所了解. public static void process( ...

  6. LTC2440串行SPI通讯时序

    LTC2440 简介 我们使用4-wire SPI接口 按照时序图上的描述,SDO是在SCLK的下降沿更新数据,那么FPGA接收端就应该在上升沿采集数据. 实际测试发现SDO数据相对于SCLK延迟了6 ...

  7. MRS_Debug仿真相关问题汇总

    解决问题如下: Debug时,看不到外设寄存器选项 Debug时,更改变量显示类型 Debug时,断点异常 跳过所有断点 取消仿真前自动下载程序 Debug时仅擦除程序代码部分flash空间 保存De ...

  8. 打开sublime text3 弹出错误提示 Error trying to parse settings: Expected value inPackages\UserJSONsublime-settings:13:17

    问题:打开sublime text3 弹出错误提示 Error trying to parse settings: Expected value inPackages\UserJSONsublime- ...

  9. 【一句话】CAP原则

    首先一句话: 如果出现网络分区(P),持有旧数据的节点是否要继续提供服务,提供就保证了可用(A),但数据不一定新,放弃了C:如果不提供服务,则意味着放弃了可用性A,但是保证数据一致(C). 我的理解: ...

  10. 多变量两两相互关系联合分布图的Python绘制

      本文介绍基于Python中seaborn模块,实现联合分布图绘制的方法.   联合分布(Joint Distribution)图是一种查看两个或两个以上变量之间两两相互关系的可视化图,在数据分析操 ...