本系列主要参考《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):
    	Properties {
    _MainTex ("Base (RGB)", 2D) = "white" {}
    _Cutoff ("Cutoff Value", Range(0,1)) = 0.5
    }
  2. 然后,告诉Shader我们将把这个Shader设置成cutoff类型:
    		CGPROGRAM
    #pragma surface surf Lambert alphatest:_Cutoff
  3. 最后,使用贴图中我们希望使用的通道值来填充o.Alpha。
    		void surf (Input IN, inout SurfaceOutput o) {
    half4 c = tex2D (_MainTex, IN.uv_MainTex);
    o.Albedo = c.rgb;
    o.Alpha = c.g;
    }
使用不同_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透明技术。
呼呼,以后要验证一下是不是真的在移动设备上反而效率更低了

【Unity Shaders】Transparency —— 透明的cutoff shader的更多相关文章

  1. Unity Shaders 第一个默认程序分析

    Unity Shaders 第一个默认程序 Shader "Custom/Shader" { Properties { _MainTex ("Base (RGB)&quo ...

  2. 【Unity Shaders】Transparency —— 使用alpha通道创建透明效果

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  3. 【Unity Shaders】Shader学习资源和Surface Shader概述

    写在前面 写这篇文章的时候,我断断续续学习Unity Shader半年了,其实还是个门外汉.我也能体会很多童鞋那种想要学好Shader却无从下手的感觉.在这个期间,我找到一些学习Shader的教程以及 ...

  4. 【Unity Shaders】Transparency —— 使用渲染队列进行深度排序

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  5. 【Unity Shaders】使用CgInclude让你的Shader模块化——创建CgInclude文件存储光照模型

    本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图. 这里是本书所需的代码 ...

  6. 【Unity Shaders】使用CgInclude让你的Shader模块化——Unity内置的CgInclude文件

    本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图. 这里是本书所需的代码 ...

  7. 【Unity Shaders】Mobile Shader Adjustment —— 为手机定制Shader

    本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图.这里是本书所需的代码和 ...

  8. 【Unity Shaders】使用CgInclude让你的Shader模块化——使用#define指令创建Shader

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  9. 【Unity Shaders】Mobile Shader Adjustment—— 什么是高效的Shader

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

随机推荐

  1. 谈谈Python中的decorator装饰器,如何更优雅的重用代码

    众所周知,Python本身有很多优雅的语法,让你能用一行代码写出其他语言很多行代码才能做的事情,比如: 最常用的迭代(eg: for i in range(1,10)), 列表生成式(eg: [ x* ...

  2. 原生js之canvas时钟组件

    canvas一直是前端开发中不可或缺的一种用来绘制图形的标签元素,比如压缩上传的图片.比如刮刮卡.比如制作海报.图表插件等,很多人在面试的过程中也会被问到有没有接触过canvas图形绘制. 定义 ca ...

  3. Redis Sentinel主从高可用方案

    Redis Sentinel主从高可用方案 本文介绍一种通过Jed和Sentinel实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上 ...

  4. UML总结4---UML九种图关系说明

    转自:http://blog.csdn.NET/chenyujing1234/article/details/8173519 UML中包括九种图:用例图.类图.对象图.状态图.时序图.协作图.活动图. ...

  5. Nginx配置二级目录/路径 映射不同的反向代理和规避IP+端口访问

       当配置Nginx来映射不同的服务器 可以通过二级路径来反向代理 来解决一个外网端口实现多个服务访问. 配置如下: server { listen ; server_name demo.domai ...

  6. ubuntu15.10 opencv3.1 安装配置codeblocks

    安装codeblocks: sudo add-apt-repository ppa:damien-moore/codeblocks-stable // 添加codeblocks的ppa sudo ap ...

  7. 如何找回Oracle所有用户丢失的密码

    如何找回Oracle所有用户丢失的密码: 方法一:1.以操作系统验证的方式登录 SQL>conn / as sysdba; 2.查看系统中的用户名. SQL>select USERNAME ...

  8. delphi 面向对象实用技能教学一(递归)

    本例使用类与TList相结合,用简洁的方法,实现了一个 HTML 解析与格式化功能.所用到的知识点如下:1.类的提前申明2.TList用法3.String的指针操作4.单例设计5.递归用法 编程是综合 ...

  9. django模板语言中的extends,block和include

    extends和block一起用 它们用于母版和子版的继承 在母版html中将一些需要替换的部分用{% block xxx %}...{% endblock %}括起来, 在子版html中,在第一行需 ...

  10. PHP While 循环

    PHP 循环 - While 循环 循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块. PHP 循环 在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行.我们可以在代码中使用循 ...