首先是效果

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

大概原理:一个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. shape {select ...} append ({select ...} RELATE ID TO PARAMETER 0,ID TO PARAMETER 1)

    1.问题描述 最近在写vb.net的时候,碰到了一个有点棘手的问题.就是在vb里面去解决一对多的关系. 对应关系如下,一个合同会对应多个开票. 最简单暴力的方法就是循环查询了,但是这样子肯定不行的.如 ...

  2. [cocos2d-x]捕鱼达人鱼和子弹的碰撞检测

    检测方法如图所示,步骤在注释中也写的很清楚了.

  3. Goby安装与使用

    前言 Goby是一款基于网络空间测绘技术的新一代网络安全工具,它通过给目标网络建立完整的资产知识库,进行网络安全事件应急与漏洞应急. Goby可提供最全面的资产识别,目前预置了超过10万种规则识别引擎 ...

  4. centos7系统的安装部署过程

    一.进入系统引导界面进行配置 引导项说明: 安装centos7系统(*) 测试光盘镜像并安装系统 排错模式(修复系统 重置系统密码) 补充:centos7系统网卡名称 默认系统的网卡名称 eth0 e ...

  5. ChatGPT 背后核心技术的白话版

    本文是关于ChatGPT 背后核心技术实现的一个通俗白话版,不涉及到的AI具体实现的技术细节哦. 在编排上增加了一些分割,内容具体如下: LLMs(大型语言模型) 如果将ChatGPT比作是动物,它就 ...

  6. Vue22 VueCli 脚手架

    1 简介 CLI 是 Command-Line Interface, 翻译为命令行界面, 但是俗称脚手架 Vue CLI是一个官方发布 vue.js 项目脚手架 使用 vue-cli 可以快速搭建 V ...

  7. Idea导入本地Mavenue项目

    转https://www.cnblogs.com/kaola8023/p/14069519.html 一.导入Maven项目的问题 1. 安装后运行idea会直接打开如下页面 , 我们点击 Open  ...

  8. python爬取丁香园疫情数据

    毕设需求了就是说 导师要做关于时间线的- -看发展趋势 不得不今天又现学现卖 首先 创建一个python文件 python.file 引入一点资源 # 发送请求 import requests # 页 ...

  9. Sentinel熔断与限流

    1.简介 在线文档: https://sentinelguard.io/zh-cn/docs/system-adaptive-protection.html 功能: 流量控制 速率控制 熔断和限流 和 ...

  10. C# Replace:一个熟悉而又陌生的替换

    前言 Replace 的作用就是,通过指定内容的替换,返回一个新字符串. 返回值中,已将当前字符串中的指定 Unicode 字符或 String 的 所有匹配项,替换为指定的新的 Unicode 字符 ...