【Unity Shaders】Mobile Shader Adjustment —— 为手机定制Shader
本系列主要參考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同一时候会加上一点个人理解或拓展。
这里是本书全部的插图。这里是本书所需的代码和资源(当然你也能够从官网下载)。
========================================== 切割线 ==========================================
写在前面
在上一篇里,我们学习了一些技巧来初步优化Shader。这次,我们学习很多其它的技术来实现一个更复杂的Shader:Normal-Mapped Specular Shader。这些技术包含:使用光照函数的两个新变量halfasview或者approxview,降低使用的贴图数量,以及对贴图进行更好的压缩。
准备工作
- 创建一个新的场景和一个球体,加入一个平行光。
- 创建一个新的Shader和Material,能够命名为MobileShader。
- 把Shader赋给Material,把Material赋给球体。
实现
- 首先,还是改动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; // 该像素的不透明度
}; - 以下是建立#pragma声明。这能够控制Surface Shader各属性的开关,使得Shader更高效或者更低效:
CGPROGRAM
#pragma surface surf MobileBlinnPhong exclude_path:prepass nolightmap noforwardadd halfasview解释:忽略延迟光照,不支持光照贴图,仅仅接受一个单一的平行光光源作为逐像素光源。最后,使用halfasview声明告诉Unity,我们使用一个介于光照方向和观察方向之间的half vector来取代真正的观察方向viewDir来计算光照函数。这将加速Shader的处理时间,由于这是基于逐顶点而非逐像素计算而得的。尽管这样得到的结果是近似值,但对于移动平台来说足够了。
- 建立和Properties块中各变量的联系。和之前不同,我们这次使用fixed来得到高光指数滑条的值:
sampler2D _Diffuse;
sampler2D _NormalMap;
fixed _SpecIntensity; - 得到贴图的UV坐标。在上一篇就提过,为了节省变量空间,我们仅使用一个UV值:
struct Input
{
half2 uv_Diffuse;
}; - 由于我们在声明中加入了新的变量,我们能够在光照函数中使用新的參数:
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;
} - 最后,我们在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));
}
解释
【Unity Shaders】Mobile Shader Adjustment —— 为手机定制Shader的更多相关文章
- 【Unity Shaders】使用CgInclude让你的Shader模块化——创建CgInclude文件存储光照模型
本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图. 这里是本书所需的代码 ...
- 【Unity Shaders】使用CgInclude让你的Shader模块化——Unity内置的CgInclude文件
本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图. 这里是本书所需的代码 ...
- 【Unity Shaders】使用CgInclude让你的Shader模块化——使用#define指令创建Shader
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Mobile Shader Adjustment—— 什么是高效的Shader
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- Unity Shaders Vertex & Fragment Shader入门
http://blog.csdn.net/candycat1992/article/details/40212735 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Sha ...
- 【Unity Shaders】Vertex & Fragment Shader入门
写在前面 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Shader中实现描边效果的弊端,也就是只对表面平缓的模型有效.这是因为我们是依赖法线和视角的点乘结果来进行描边判 ...
- 【Unity Shaders】Shader学习资源和Surface Shader概述
写在前面 写这篇文章的时候,我断断续续学习Unity Shader半年了,其实还是个门外汉.我也能体会很多童鞋那种想要学好Shader却无从下手的感觉.在这个期间,我找到一些学习Shader的教程以及 ...
- 【Unity Shaders】Transparency —— 透明的cutoff shader
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Diffuse Shading——在Surface Shader中使用properties
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
随机推荐
- 在高德地图应用api,和api展出的标记小的应用程序
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- TextView于getCompoundDrawables()使用演示样本的方法
MainActivity例如下列: package cc.testcompounddrawables; import android.app.Activity; import android.grap ...
- 设计Kafka的High Level Consumer
原文:https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Group+Example 为什么使用High Level Consumer ...
- 弹出层 div dialog
写你自己的弹出框 风格,如下面 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWluZ2xpYW5sdWFu/font/5a6L5L2T/fontsize ...
- java它 ------ 图形界面(两)
<img src="http://img.blog.csdn.net/20150604093446275?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi ...
- java.lang.ClassCastException: java.lang.NoClassDefFoundError cannot be cast to java.lang.RuntimeException
不是一个Exception,而是一个Error,要强制转成Exception类型,就出错了java.lang.NoClassDefFoundError java.lang.RuntimeExcepti ...
- 国产与第三方库FFmpeg SDK
一个.编译并安装第三方库 1. libfaac # tar -zxvf faac-1.28.tar.gz # cd faac-1.28 # ./configure --prefix=/opt/YOUR ...
- 十天学Linux内核之第六天---调度和内核同步
原文:十天学Linux内核之第六天---调度和内核同步 心情大好,昨晚我们实验室老大和我们聊了好久,作为已经在实验室待了快两年的大三工科男来说,老师让我们不要成为那种技术狗,代码工,说多了都是泪啊,, ...
- 虚拟化(一):虚拟化和vmware产品描述
由于公司最近取得了虚拟化监控,因此,我们需要虚拟化的认识,总结学习,对于虚拟化的概念.从百度百科,例如下列: 虚拟化.是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上 ...
- 它们的定义ListView,实现Item除去滑动和滑出菜单效果
这个程序是基于变化从网上开源项目,详情货源忘记.懒得去搜索,.假设有不合适的地方.请与我联系作者.我会及时回复和处理! 序中主要包括两个ListView,一个是实现側滑删除.一个是側滑出菜单,代码中的 ...