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

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

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

写在前面

在上一篇里,我们学习了一些技巧来初步优化Shader。这次,我们学习更多的技术来实现一个更复杂的Shader:Normal-Mapped Specular Shader。这些技术包括:使用光照函数的两个新变量halfasview或者approxview,减少使用的贴图数量,以及对贴图进行更好的压缩。

准备工作

  1. 创建一个新的场景和一个球体,添加一个平行光。
  2. 创建一个新的Shader和Material,可以命名为MobileShader。
  3. 把Shader赋给Material,把Material赋给球体。

实现

  1. 首先,还是修改Properties块。本节我们需要一张diffuse贴图,它的alpha通道值对应像素的光滑度(Gloss);以及一张法线贴图,和高光指数的滑动条。

       Properties {_Diffuse ("Base (RGB) Specular Amount (A)", 2D) = "white" {}_NormalMap ("Normal Map", 2D) = "bump"{}_SpecIntensity ("Specular Width", Range(0.01, 1)) = 0.5}

    解释:一直没有彻底搞懂Unity SurfaceOutput里面各变量的计算细节。这里再详细解释下。SurfaceOutput里面的内置变量可以见这篇,如下:

    struct SurfaceOutput {  half3 Albedo;      // 该像素的反射率,反应了像素的基色 half3 Normal;     // 该像素的法线方向half3 Emission;   // 该像素的自发光颜色,使得即便没有光照也可以物体本身也可以发出光half Specular;     // 该像素的高光指数  half Gloss;         // 该像素的高光光滑度,值越大高光反射越清晰,反之越模糊  half Alpha;         // 该像素的不透明度
    };
  2. 下面是建立#pragma声明。这可以控制Surface Shader各属性的开关,使得Shader更高效或者更低效:
         CGPROGRAM#pragma surface surf MobileBlinnPhong exclude_path:prepass nolightmap noforwardadd halfasview

    解释:忽略延迟光照,不支持光照贴图,只接受一个单一的平行光光源作为逐像素光源。最后,使用halfasview声明告诉Unity,我们使用一个介于光照方向和观察方向之间的half vector来代替真正的观察方向viewDir来计算光照函数。这将加速Shader的处理时间,因为这是基于逐顶点而非逐像素计算而得的。虽然这样得到的结果是近似值,但对于移动平台来说足够了。

  3. 建立和Properties块中各变量的联系。和之前不同,我们这次使用fixed来得到高光指数滑条的值:
           sampler2D _Diffuse;sampler2D _NormalMap;fixed _SpecIntensity;
  4. 得到贴图的UV坐标。在上一篇就提过,为了节省变量空间,我们仅使用一个UV值:
           struct Input {half2 uv_Diffuse;};
  5. 由于我们在声明中添加了新的变量,我们可以在光照函数中使用新的参数:
           inline fixed4 LightingMobileBlinnPhong (SurfaceOutput s, fixed3 lightDir, fixed3 halfDir, fixed atten){fixed diff = max (0, dot (s.Normal, lightDir));fixed nh = max (0, dot (s.Normal, halfDir));fixed spec = pow (nh, s.Specular * 128) * s.Gloss;fixed4 c;c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec) * (atten * 2);c.a = 0.0;return c;}
  6. 最后,我们在surf函数中完成对像素颜色的计算:
         void surf (Input IN, inout SurfaceOutput o) {fixed4 diffuseTex = tex2D (_Diffuse, IN.uv_Diffuse);o.Albedo = diffuseTex.rgb;o.Gloss = diffuseTex.a;o.Alpha = 0.0;o.Specular = _SpecIntensity;o.Normal = UnpackNormal(tex2D(_NormalMap, IN.uv_Diffuse));}
最后,得到的效果如下:

解释

我们最后总结一下使用过的所有技术:优化变量类型,共享UV坐标,减少处理的光源个数,让Shader只工作在特定的渲染器上,使用近似值代替精确值,以及减少或压缩贴图。

转载于:https://www.cnblogs.com/xiaowangba/p/6314679.html

【Unity Shaders】Mobile Shader Adjustment —— 为手机定制Shader相关推荐

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

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

  2. 【Unity Shaders】Diffuse Shading——创建一个基本的Surface Shader

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

  3. 【Unity Shaders】法线纹理(Normal Mapping)的实现细节

    写在前面 写这篇的目的是为了总结我长期以来的混乱.虽然题目是"法线纹理的实现细节",但其实我想讲的是如何在shader中编程正确使用法线进行光照计算.这里面最让人头大的就是各种矩阵 ...

  4. 【Unity Shaders】Lighting Models —— 灯型号Lit Sphere

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

  5. 【Unity Shaders】最简单的顶点/片元着色器3

    微信号:ITComputerGraph 更多精彩内容,关注公众号<IT木子李> Shader "Unity Shaders/Simple Shader3" {SubSh ...

  6. 【Unity Shaders】Reflecting Your World —— Unity3D中的法线贴图和反射

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

  7. 【Unity Shaders】游戏性和画面特效——创建一个夜视效果的画面特效

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

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

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

  9. 【Unity Shaders】Reflecting Your World(反射吧!)介绍

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

最新文章

  1. MapReduce 中 UDF、UDAF、UDTF
  2. Quartz在Spring中设置动态定时任务 .
  3. 一条sql语句,要修改一个字段的俩个值,比如把字段sex中的男改为女,女改为男...
  4. os.chdir 的作用是什么_为什么宝宝有事都愿意找妈妈?爸爸也要尽到责任才行
  5. pythonfor循环是迭代器吗_[Python] 迭代器是什么?你每天在用的for循环都依赖它!...
  6. 一次cpu占用高的定位分析
  7. LeeCode 130 DFS
  8. 戴尔t40服务器自动开机,新安装的戴尔T40服务器风扇不转了是什么原因?
  9. vue-element之学生信息表格(详细代码)
  10. 小程序接入微信视频号配置指南
  11. HaaS EDU物联网项目实战:微信小程序实现云养花
  12. Spring事务管理理解
  13. c语言des算法实验报告,c语言实现des算法des加密算法实验报告
  14. HTML5期末大作业:电商网站设计——仿淘宝电商网站管理系统21页(含毕业设计论文7500字) HTML+CSS+JavaScript
  15. AD9235芯片手册阅读笔记
  16. 专访IBM孙震:流程挖掘行业前景广阔,市场教育待完成
  17. “AI”加持,一起“沉浸式体验”企业的走心服务
  18. 一篇可能让你每年多赚5万的写简历技术贴!
  19. ArcMap制图相关问题
  20. 世界最小量子计算机诞生,离子阱量子技术或成为最终赢家?

热门文章

  1. ASP中FSO的神奇功能(1)
  2. 动态执行sql语句用法
  3. ES11新特性_String.prototype.matchAll方法---JavaScript_ECMAScript_ES6-ES11新特性工作笔记063
  4. SpringCloud工作笔记089---SpringBoot中Mybatis使用Condition_Criteria如何筛选日期类型数据
  5. Tomcat安装配置与基础使用
  6. linux 下安装ecos开发环境,Ubuntu 10.04中安装eCos 3.0
  7. 函数指针c语言typedef,typedef 函数指针的用法(附例子)
  8. matlab双立方插值法_双三次插值(Bicubic interpolation)缩放图片
  9. 配置python开发环境搭建_Eclipse配置Python开发环境
  10. 江苏大学计算机导论试题,江苏大学毕业设计任务书