Unity Shader 之遮挡透明
先放出结果图:榔头被挡住部分显示出绿色
当被遮挡时,遮挡部分透明处理,那么需要涉及渲染深度的知识。引擎是如何判断哪个物体在前面哪个物体在后面呢?
深度:每个像素有自己的深度值,离摄像机近的深度小,远的深度大
深度缓冲区:存储每个像素的深度
颜色缓冲区:存储每个像素的颜色
过程:首先比较像素的深度与深度缓冲区同一位置的深度,如果前者小于后者,则未通过深度测试;否则,通过深度测试,将前者写入后者,将该像素的颜色写入到颜色缓冲区。将颜色缓冲区像素颜色显示到屏幕上。
通过这个过程即可把深度小的像素剔除掉,将深度大的显示到屏幕上,从而实现物体的前后顺序。
UnityShader提供了ZWrite 和 ZTest对应深度写入和深度测试。
调整ZWrite可以控制是否将深度写入到深度缓冲区,当然,前提是深度测试通过,如果没通过测试,那么肯定是无法写入的
调整ZTest可以定义上述中前者与后者的比较关系,默认为LEqual即小于等于时通过测试
那么可以得到一种实现思路,用两个PASS:
第一个PASS:ZTest 为 Greater,ZWrite 为 Off,当该像素被遮挡即深度大于深度缓冲区对应位置深度时执行该PASS,那么就可以在该PASS中实现被遮挡像素的效果。
第二个PASS:ZTest为LEqual,ZWrite 为 On,这个PASS与上述PASS是互斥的,在这个PASS中实现未被遮挡像素的效果。
设置ZWrite 是为了防止两个PASS都执行,如果第一个PASS的ZWrite为On,某一像素未被遮挡时,执行第一个PASS,将像素深度写入深度缓冲区,然后轮到第二个PASS进行深度测试时也会通过,因为小于等于嘛。
被遮挡像素透明实现用了边缘光使得更炫酷。边缘光公式大概如下:
fixed rim=1-saturate(dot(worldNormalDir,worldViewDir));
fixed3 finalCol=_RimColor.xyz*pow(rim,_RimPower)*_RimIntensity
通过第一个式子可以得到一个参数rim,顶点法线方向与视角方向契合度越高则rim越小,否则rim越大,即越靠近边缘rim越大
第二个式子中pow是为了提高边缘光硬度
工程下载
Unity Shader 之遮挡透明相关推荐
- unity shader 入门 全透明与半透明效果实现
片元函数的fixed4类型的返回值的第4位即为阿尔法值,0代表完全不显示(透明),1代表完全显示.中间的数值代表半透明.但只修改这个值是不能直接修改透明度的,因为还要对队列等进行修改. 本文介绍透明度 ...
- 【unity shader 入门精要 读书笔记】透明
一.透明 1.透明度测试[Alpha Test] 它采用一种"霸道极端"的机制:只要有一个片元的透明度不满足条件[通常是小于某个阈值],那么它对应的片元就会被舍弃.被舍弃的片元将不 ...
- Unity Shader 之 透明效果
本文引用 Unity Shader入门精要 开启透明混合后,一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值外,还有--透明度.透明度为1,则完全不透明,透明度为0,则完全不会显示. 在Unity ...
- Unity Shader 实现透明护盾效果
这是大致的效果图,图片压得有点糊.我参考了本篇博客 Unity shader护盾特效. 这是原博客展示的图片: 本例采用了特殊的模型与贴图,原博客里有视频链接的教程,从模型到贴图. 以下是代码 // ...
- 【unity shader】unity游戏特效-遮挡显示效果 (含边缘光、描边效果版)
不知道你们有没有在玩Black Squad这个游戏啊 在被对手干掉时会有敌人高亮显示效果 (未被做掉时) (被做掉后高亮显示敌人位置) 明明敌人被不透明物体挡住却仍然可以被渲染出来 这效果要是能扔进自 ...
- Unity Shader - Occlusion Map 遮挡贴图
目录:Unity Shader - 知识点目录(先占位,后续持续更新) 原文:Occlusion Map 版本:2019.1 Occlusion Map 遮挡贴图用于提升模型间接光影效果.间接光源可能 ...
- unity shader遮挡边缘光描边
Shader "Unlit/遮挡边缘光描边" {Properties{_MainTex("Texture", 2D) = "white" { ...
- 2d shader unity 阴影_【Unity Shader】平面阴影(Planar Shadow)
来介绍一种适用于移动平台的高性能实时阴影解决方案--平面阴影(Planar Shadow). 由于Unity内置的实时阴影实现方式是屏幕空间阴影贴图(Screen Space Shadow Map)非 ...
- Unity Shader入门
什么是Shader Shader(着色器)是一段能够针对3D对象进行操作.并被GPU所执行的程序.Shader并不是一个统一的标准,不同的图形接口的Shader并不相同.OpenGL的着色语言是GLS ...
最新文章
- 录音喊话器的故障修理_碳膜电位器故障检测及解决
- 新疆那些大学在计算机专业好,新疆哪些二本大学的计算机科学与技术专业最好?...
- 查找100 sql oracle,Oracle中SQL语句执行效率的查找与解决
- LeetCode 700 二叉搜索树中的搜索
- 小学计算机课动画制作的评课稿,信息技术2.0 | 评课磨课共成长 信息技术促进步 ——东光县第二实验小学信息技术2.0课例研讨...
- c语言中的EOF是什么意思
- Ubuntu 安装 tbb 步骤详解
- DBA的职场生涯应如何选择?
- 智能机器人走迷宫c语言游戏,(动态规划)机器人走迷宫问题(示例代码)
- 用Python 制作身高预测系统
- 【金融风控-贷款违约预测】数据挖掘学习:5.模型融合
- 六大设计原则-接口隔离原则
- pkpm弹性时程分析计算书怎么出_弹性时程分析——PKPM软件操作篇.pdf
- 【anaconda创建虚拟环境】
- X86实模式与保护模式简介
- L0范式、L1范式、L2范式解释通俗版
- Vue进阶(贰零柒):Webpack 性能优化措施汇总
- 如何使用matlab实现分段函数
- 机器学习与知识发现_在机器学习中重新“发现”量子力学
- 爱情心理学(心理学大师入门)
热门文章
- c#窗体随机点名软件
- 老烟民突然戒烟,会对身体有危害?正确戒烟这样做
- Linux for pogoplug pro 安装指导手册
- 我们已经进入网络犯罪2.0时代
- zjfc-1108,hdu-1222 wolf and rabbits
- 棋盘覆盖(java实现)
- 引领时代变化的人都是“骗子”
- 报错信息 terminate called after throwing an instance of ‘std::cad_alloc‘ what():std::bad_alloc
- python 爬虫(cookie)
- 【百度快照推广】网页快照在SEO优化中的作用