【Unity Shaders】Transparency —— 透明的cutoff shader

原创 2014年07月04日 16:08:18
  • 19554

本系列主要参考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同时会加上一点个人理解或拓展。

这里是本书所有的插图。这里是本书所需的代码和资源(当然你也可以从官网下载)。

========================================== 分割线 ==========================================

写在前面

啦啦啦,终于毕业啦~上个月上任了游戏版版主,感觉在毕业前的一个月又给自己找了不少事。自己还是小白菜多少感觉有点压力大呀,自己能力有限,希望在帮助别人的同时,也能让自己多多收获吧!
呼呼,上个月毕设答辩、考试、论坛、毕业手续一大堆事向我袭来,导致有点荒废了Shader学习。。。这个月开始放假啦,要再接再厉!
这一篇里接着学透明度。在上一篇里,我们讲到在Shader的#pragma声明中添加alpha参数来实现透明效果真的是非常方便。事实上,Unity还提供了另一种参数来实现一个更简单的透明效果,叫做cutoff transparency,是不是很耳熟?这种类型的透明效果使用一个变量来简单地控制哪些像素不要画在屏幕上。因此,cutoff transparency使得我们可以得到要么全透明效果,要么不透明的效果。而在上一篇中,我们可以控制所有范围的灰度值来影响透明度,也被称为半透明效果。

准备工作

  1. 首先创建一个新的场景,和一个新的球体和平行光。
  2. 创建新的Shader和Material,可以命名为CutoffShader。
  3. 把Shader赋给Material,再把Material赋给球体。
  4. 选择一张贴图。最好是一张灰度图,这样你可以看到cutoff的效果。

实现

  1. 首先在Properties块增加新的浮点值,它将允许我们选择中断值(cutoff value):

    [plain] view plain copy
    1. Properties {
    2. _MainTex ("Base (RGB)", 2D) = "white" {}
    3. _Cutoff ("Cutoff Value", Range(0,1)) = 0.5
    4. }
  2. 然后,告诉Shader我们将把这个Shader设置成cutoff类型:
    [plain] view plain copy
    1. CGPROGRAM
    2. #pragma surface surf Lambert alphatest:_Cutoff
  3. 最后,使用贴图中我们希望使用的通道值来填充o.Alpha。
    [plain] view plain copy
    1. void surf (Input IN, inout SurfaceOutput o) {
    2. half4 c = tex2D (_MainTex, IN.uv_MainTex);
    3. o.Albedo = c.rgb;
    4. o.Alpha = c.g;
    5. }
使用不同_Cutoff值得到的结果(从左到右依次增大):

解释

Unity给我们提供了相当一些在#pragma指令中可以使用的参数。它们给我们提供了强大的能力来改变和优化我们的Surface Shader。这正是在编写Shader以及迭代化处理时,Surface Shader如此强大和有效的原因之一。
我们的cutoff shader在#pragma指令中使用了一个新的参数,名为alphatest:VariableName。这个参数将我们的Shader设置为一个简化版本的透明度。和半透明度效果(灰度值范围内的每一个值都讲影响透明度)不同,只有_Cutoff变量控制最终的透明效果。这意味着,如果我们让_Cutoff值为0.4,那么任何灰度值低于0.4的值会被认为是透明的,而高于0.4的值被认为是不透明的。
使用这种类型的透明效果的好处是可以提高性能。之前的半透明效果的性能耗费要高于cutoff类型。但是,在移动设备上是正好相反的,这是因为对于这些小型的GPUs来说,检查一张贴图中的每一个像素值是非常耗性能的。因此,如果你正在用Unity开发一款移动应用,那么尽量使用半透明技术,而少使用本篇提到的cutoff透明技术。
呼呼,以后要验证一下是不是真的在移动设备上反而效率更低了

cutoff shader相关推荐

  1. Unity Shader 之 透明效果

    本文引用 Unity Shader入门精要 开启透明混合后,一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值外,还有--透明度.透明度为1,则完全不透明,透明度为0,则完全不会显示. 在Unity ...

  2. 2d shader unity 阴影_【Unity Shader】平面阴影(Planar Shadow)

    来介绍一种适用于移动平台的高性能实时阴影解决方案--平面阴影(Planar Shadow). 由于Unity内置的实时阴影实现方式是屏幕空间阴影贴图(Screen Space Shadow Map)非 ...

  3. unity shader 入门 全透明与半透明效果实现

    片元函数的fixed4类型的返回值的第4位即为阿尔法值,0代表完全不显示(透明),1代表完全显示.中间的数值代表半透明.但只修改这个值是不能直接修改透明度的,因为还要对队列等进行修改. 本文介绍透明度 ...

  4. shader实例:实现类似宝可梦 Pokemon 的战斗转场

    宝可梦游戏在进入战斗前会有类似这样转场动画. 例子中使用的纹理质量较差,边缘比较模糊,和shader无关. 这个UI是盖在所有UI最前面的.可以使用shader来完成这个工作,而不是复杂的动画. 使用 ...

  5. Unity Shader 常规光照模型代码整理

    Unity Shader 常规光照模型代码整理 本次整理在Unity中几种常见的光照模型,包含 1.BlinnPhong(常规光照模型) 2.ForwardRender(多灯光带有衰弱前向渲染) 3. ...

  6. 【Unity Shader】关于Stencil的理解小记

    写在前面:本文只介绍Stencil最基本的三种参数:Ref Comp Pass ,其他的略略带过. 碎碎念:之前用过Stencil,但是没有完全理解,原因在于虽然理解了每项的意思,但是实际的使用效果不 ...

  7. Unity Shader - 板砖日志 - 简单的树、草 等植物的 随风飘扬 动画

    文章目录 目的 思路 Script include cginc appled shader csharp 效果 目的 便于后续自己的 CTRL+C,V的面向复制.粘贴编程 思路 非常简单:可以使用 p ...

  8. 【Unity3D Shader编程】之九 深入理解Unity5中的Standard Shader (一)屏幕水幕特效的实现

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/49556461 作者:毛星云(浅 ...

  9. URP/LWRP Shader实现描边效果

    2021.1.11 更新: 我觉得我写得比较老了,可以看看下面新整理的文章 LWRP/URP/HDRP中的描边shader:https://zhuanlan.zhihu.com/p/354190065 ...

  10. Unity Shader - BRP - Soft Particle - 软粒子

    文章目录 环境 SoftParticleCommon.cg Alpha blend Additive blend UniformSetSoftParticleThreshold.cs CustomGr ...

最新文章

  1. 编译工具 之 ant
  2. JDK14性能管理工具:jstat使用介绍
  3. windows:(1)xmind常用快捷键
  4. electron 爬坑记
  5. 快切——响应css框架之布局结构命名
  6. PHP之数组函数(2)
  7. 适配器模式之组合模式
  8. 用于HTML5移动开发的10大移动APP开发框架
  9. 计算机联锁进路控制程序框图,计算机联锁系统技术第四章
  10. idea创建vue模板
  11. 2018携程实习生大数据分析笔试练习题
  12. 童年十大经典玩耍游戏
  13. Android Tools 在线更新SDK Manager
  14. Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1;
  15. tup,list,dict,set的创建
  16. cv.bitwise_and用法
  17. 中国果汁饮料行业营销状况与竞争趋势预测报告(2022-2027年)
  18. 选择ip代理软件要看那几点?
  19. 有一种情愫,它不属于暧昧
  20. Java的异常Exception----(最简单明了的总结)

热门文章

  1. XOM版本1.2.5
  2. VB SendMessage 函数
  3. 我的世界服务器矿怎么无限刷,我的世界中可以无限刷矿的指令是什么quest; | 手游网游页游攻略大全...
  4. promise .then和async await的使用
  5. debian7修改密码
  6. python高频词汇表大全_我们用程序整理出了一份Python英语高频词汇表,拿走不谢!...
  7. 输入任意一个字符串,判断这个字符串是否是回文,回文示例: 上海自来水来自海上
  8. Fiddler高级用法—FiddlerScript抓取app网页json数据并保存
  9. easyUI双击事件,完整总结
  10. c 语言加壳项目,C 加壳工具,快速完成加密保护