Unity3D Built-in Shader详解一
Unity3D内置了很多Shader,文档很详细,自己翻一下.便于加深印象.
首先先解释下Unity3D的Shader.Unity里面的Shaders是使用一种叫ShaderLab的语言编写的,它同微软的.FX文件或者NVIDIA的CgFX有些类似。传统意义上的vertex shader和pixel shader 还是使用标准的Cg/HLSL 编程语言编写的。(因此Unity文档里面的Shader,都是指用ShaderLab编写的代码)
然后我们来看下Unity3D自带的60多个Shader。 这些Shader被分为五个大类:Normal,Transparent,Transparent Cutout,Self-llluminated,Reflective。由于数量比较多,将分几个篇幅一一介绍。
(一) Normal Shader Family
这个家族一共9个Shader,都是针对不透明的对象的。
(1) Vertex-Lit:
最简单的一种Shader之一,所有照射在该物体上的光在一个Pass里面渲染完,光源只在顶点计算。所以不会有任何基于像素渲染得效果,比如说:normal mapping,light cookies和shadows.这个shader对模型的剖分(将一个物体从几何描述变为多边形表示的过程)非常敏感,如果你将一个点光源放在很靠近一个立方体的一个顶点那里,并且对立方体使用这个shader,光源只会在角落计算。基于像素光照的shader对剖分没有要求,在表现圆形高光上效果也很好。如果上述情况时你想要的效果,你可以考虑使用一个基于像素光照的shader或者增加模型的剖分。(增加顶点数)
总的来说,这个shader的渲染代价比较小。这个shader包含了2个subshader,分别对应可编成管线和固定管线。是所有硬件都支持的一个最基本的shader。如果设备支持可编成管线,那使用可编成管线的subshader,否则使用固定管线的。
(2) Diffuse:
Diffuse基于一个简单的光照模型-Lambertian,光照强度随着物体表面和光入射角夹角的减小而减小(即光垂直于表面时强度最大)。光照的强度只和该角度有关系,和摄像机无关。由于这是一个基于像素光照的shader,因此他有这类shader的优势,同时他需要设备支持可编程管线,如果设备不支持,则自动使用Vertex-Lit这个Shader。
总的来说,这个shader渲染代价比较小。
(3) Specular
Specular 使用和Diffuse相同的光照模型,但是添加了一个和观察角度相关的反射高光。这个被称为Blinn-Phong光照模型。他包含了一个反射强光,这个反射高光物体表面角度,光的入射角度以及观察者角度都有关系。这种高光计算方法实际上是对实时光源模糊反射的一种具有可行性的模拟。模糊的等级通过inspector里面Shininess这个变量控制。
主纹理的alpha通道被用来当作Specular Map来使用(有时候也称gloss map),它定义了物体的反光率。纹理中alpha里面全黑 的部分将完全不反光(即反光率为0%)。而全白的的部分反光率为100%。这个Map在你的物体在不同的部分有不同的反光率的时候非常有用。比如说,锈迹斑斑的金属会反光率低,而磨光的金属反光率比较高。口红的反光率比皮肤高,而皮肤的反光率比棉质衣服高。一个精心制作的Specular Map将会让玩家身临其境。如果目标设备不支持可编程管线,则自动使用Vertex-Lit这个Shader。
这个shader的渲染代价会比较大。
(4)Bumped Diffuse
同Diffuse Shader一样,这个Shader基于Lambertian光照模型,同时使用了normal mapping技术来增加物体表面细节。相对于通过增加剖分来表现物体表面细节的方式,normal mapping并不改变物体的形状,而是使用一张称为Normal Map的特殊纹理来达到这种效果。在normal map中,每个象素的颜色代表了该像素所在物体表面的法线,然后通过这个法线(而不是通过物体模型计算而来的法线)来计算光照。可以说Normal Map在计算光照的过程中“高效地修改”了整个模型。
如何创建Normal maps:你可以通过导入一张普通的灰度图(白色表示凸起,黑色表示凹进)Unity会自动将它转换为Normal Map。
技术细节:这里使用Normal map是一种“Tangent space Normal Map”,Tangent space(正切空间)是一个跟随模型物体表面的空间。在这个空间中,z轴始终从表面指向外面。Tangent space Normal Map相对于另一种被称为“Object space Normal Map”来说有点复杂,但是他有一些优势。1)可以使用在各种奇形怪状的表面 2)便于在同一物体不同区域或者不同物体间复用
具体关于Tangent Space Normal Map和Object Space Normal Map的区别,下次再讲。
如果调用这个shader失败,则会调用Diffuse这个shader,一般而言,该shader渲染代价低。
(5) Bumped Specular
和Specular一样的光照模型,相比Specular而言,它使用一张Tangent Space Normal Map来描述物体表面法向量的变化,来增加物体细节。(关于normal map具体见Bumpped Diffuse)如果调用失败,则使用Specular这个shader,一般而言,这个shader的渲染代价会比较大。
(6) Parallax Diffuse
Parallax Normal mapped与传统的normal mapped一样,但是对“深度”的模拟更佳。额外的深度效果是通过Height Map(高度图)来实现的。Height Map在Normal map的alpha通道里面保存。全黑表示么有高度,而白色表示有高度。通常这用来表现石头或者砖块间的裂缝。
Parallax mapping的技术很简单,因此会有些人工痕迹或者不太正常的效果出现。尤其是,急剧陡峭的高低转换在高度图里面应该避免。在inspector里面调整height数值来调整高度的范围,有时候会造成物体不真实,凌乱的情况。因此建议使用高度变化平缓的高度图或者将高度数值设置比较低,让表面看起来比较平缓。
这个shader的渲染代价相比bumped diffuse而言更大。如果调用这个Shader失败,则自动使用Bumped Diffuse。
(7) Parallax Specular
与Bumped Spcular相比,增加了一张Height Map来描述深度细节。关于Height Map,见parallax Diffuse。如果调用失败,则调用Bumped Specular这个Shader。
(8) Decal
这个Shader在unity文档里面的描述和Unity3.0有明显的实现区别,文档由于比较老,07年写的,官网下的Built-in Shader里面,decal是使用可编程管线实现的,就是说,如果你的机器不支持可编程管线,会使用diffuse,因为diffuse也不需要可编程管线,所以只能使用vertex-lit。这个Shader除了主纹理之外,这个Shader还是用了第二张纹理用来描述细节。第二张用来Decal(贴花)的纹理使用alpha通道来确定是否覆盖主纹理。贴花用的纹理只是对主纹理的补充。比如说你有一个砖砌的墙壁,你可以使用一个砖块的纹理作为主纹理,然后使用带有alpha通道的Decal纹理在墙壁的不同地方涂鸦。
(9) Diffuse Detail
这是一个普通的diffuse shader加上一些额外数据的shader。它允许你定义第二张纹理,称为Detail Texture。当camera靠近的时候,Detail Texture逐渐显示出来,一般用于地形。比如说,当你使用一张低分辨率的纹理拉升到整个地形上的时候。随着camera逐渐拉近,低分辨率的纹理开始模糊,这不是我们想要的效果。为了避免这个效果,创建一张Detail 纹理会将地形tile化。在这种模式下,随着camera逐渐拉近,额外的细节将会出现以避免出现模糊的效果。
Detail 纹理是覆盖在主纹理上面的。Detail纹理中深色的部分将会使得主纹理变深,而淡色的部分将会使主纹理变亮,Detail纹理通常是浅灰色。(与Decal里面Decal纹理不同的是,Decal纹理是RGBA,通过alpha控制Decal Texture与Main Texture的融合,而Detail的纹理是RGB,直接是两张纹理的rgb通道分别相乘再*2,就是说,Detail纹理中颜色数值 = 0.5不会改变主纹理颜色,>0.5会变亮,<0.5加深)
Unity3D Built-in Shader详解一的更多相关文章
- Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)
前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...
- Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(下)
LinearGradient 线性渐变渲染器 LinearGradient中文翻译过来就是线性渐变的意思.线性渐变通俗来讲就是给起点设置一个颜色值如#faf84d,终点设置一个颜色值如#CC423C, ...
- unity3D游戏开发之详解Animation类和Animator类
详解Animator类和Animation类 链接: http://wenku.baidu.com/link?url=SiaUYcdrNYjOYrWVDJSKGAYdJOntMTOhsVJtyBk2i ...
- unity3d 获取游戏对象详解
原文地址:http://www.xuanyusong.com/archives/2768 我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能 ...
- Android项目实战(三十九):Android集成Unity3D项目(图文详解)
需求: Unity3D 一般用于做游戏 而且是跨平台的.原本设计是Android 应用端A(原生开发)进行一些业务处理,最后由A 打开Android 应用端B(Unity3D 游戏开发)进行游戏操作. ...
- Unity Built-in Shader详解三
上次讲的是Transparent Shader Family,他们是绘制半透明的对象使用的,但他们并不能满足我们全部的要求. Transparent Cutout Shader Family是对半透明 ...
- Unity Built-in Shader详解二
这次主要讨论Unity自带的Shader中Transparent Shader Family 这个家族的Shader一共7种,原理和类型与Normal中的上差不多,只不过这些Shader是用在半透明或 ...
- (转载)Unity3d摄像机Camera参数详解
1. Clear Flags:清除标记.决定屏幕的哪部分将被清除.一般用户使用对台摄像机来描绘不同游戏对象的情况,有3中模式选择: Skybox:天空盒.默认模式.在屏幕中的空白部分将显示当前摄像机的 ...
- Unity3D中的Coroutine详解
Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutin ...
随机推荐
- [Educational Codeforces Round 16]B. Optimal Point on a Line
[Educational Codeforces Round 16]B. Optimal Point on a Line 试题描述 You are given n points on a line wi ...
- Android使用OkHttp实现带进度的上传下载
先贴上MainActivity.java package cn.edu.zafu.sample; import android.os.Bundle; import android.support.v7 ...
- Django 的css和js压缩插件:django_compressor
今天尝试了django_conpressor,一个在django框架中压缩css和js的插件,灰常有用 我把它加载在我的base的HTML template中,原来未经压缩的css和js是: < ...
- PHP 调试用函数
2014年7月4日 10:27:59 有些系统函数可以在调试程序时救急用: get_class_methods(); get_class_vars(); get_object_vars(); get_ ...
- MySQL入门书籍和方法分享
本文罗列了一些适用于MySQL及运维入门和进阶使用的书籍. 背景:各大论坛上总是有很多同学咨询想学习数据库,或者是为入行DBA做些准备.几年来作为一个MySQL DBA的成长过程有一些积累和感悟,特此 ...
- codeforces 476C.Dreamoon and Sums 解题报告
题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...
- codeforces C. Arithmetic Progression 解题报告
题目链接:http://codeforces.com/problemset/problem/382/C 题目意思:给定一个序列,问是否可以通过只插入一个数来使得整个序列成为等差数列,求出总共有多少可能 ...
- ubuntu使用root账户登录
1.先设定一个root的密码 sudo passwd root 2.编辑lightdm.conf sudo gedit /etc/lightdm/lightdm.conf 最后一行添加 greeter ...
- cenos配置
#修复ifconfig1.查看 /sbin/ifconfig是否存在 echo $PATH2.查看ifconfig命令是否存在ls /sbin |grep ifconfig如果ifconfig命令存在 ...
- Android之XML序列化和解析
XML文件是一种常用的文件格式,可以用来存储与传递数据 ,本文是XML文件序列化与解析的一个简单示例 写文件到本地,并用XML格式存储 /** * 写xml文件到本地 */ private void ...