首先是效果

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

大概原理:一个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. 15、MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

    转载自 一.报错信息: Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollback ...

  2. 【转载】EXCEL VBA 20个有用的ExcelVBA代码

    1.显示多个隐藏的工作表 如果你的工作簿里面有多个隐藏的工作表,你需要花很多时间一个一个的显示隐藏的工作表. 下面的代码,可以让你一次显示所有的工作表 Sub UnhideAllWoksheets() ...

  3. Dubbo 3 之 Triple 流控反压原理解析

    作者:顾欣 Triple 是 Dubbo 3 提出的基于 HTTP2 的开放协议, 旨在解决 Dubbo 2 私有协议带来的互通性问题. Triple 基于 HTTP/2 定制自己的流控,支持通过特定 ...

  4. [常用工具] cvat安装与使用指北

    cvat是一个非常好用的标注工具,但是也是非常难以安装的标注工具,所以本文简单讲一讲如何安装与使用cvat.cvat最好在ubuntu18.04安装,windows平台安装难度很大,然后在其他平台使用 ...

  5. [常用工具] git基础学习笔记

    git基础学习笔记,参考视频:1小时玩转 Git/Github 添加推送信息,-m= message git commit -m "添加注释" 查看状态 git status 显示 ...

  6. react 高效高质量搭建后台系统 系列 —— 请求数据

    其他章节请看: react 高效高质量搭建后台系统 系列 请求数据 后续要做登录模块(主页),需要先和后端约定JSON数据格式,将 axios 进行封装,实现本地的数据模拟 mockjs. Tip:s ...

  7. Ubuntu 中科大源的使用

    官方网址: https://mirrors.ustc.edu.cn/help/ubuntu.html

  8. [cocos2d-x]我发现的内存管理机制的一些问题

    之前看过的一些文章中关于内存的管理机制讲的非常好,但是我发现它们在谈到每一帧都会创建一个新的内存池的时候,我发现源码并不是这样: PoolManager* PoolManager::getInstan ...

  9. LTC2440串行SPI通讯时序

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

  10. Avalonia 实现动态托盘

    先下载一个gif图片,这里提供一个gif图片示例 在线GIF图片帧拆分工具 - UU在线工具 (uutool.cn) 使用这个网站将gif切成单张图片 创建一个Avalonia MVVM的项目,将图片 ...