-
Unity3D Built-in Shader,unity3d
内
置
shader
详解
< br>
unity3d
内置了很多
Shader,
文档很详细
,
自己翻一下
.
便于
加深印象
.
< br>首先先解释下
Unity3D
的
里面的
Shaders
是使用一种叫<
/p>
ShaderLab
的语言编写的,它同微软的
< br>.FX
文件或
者
NVIDIA
的
CgFX
有
些类似。传统意义上的
vertex
shader
和
pixel
shader
还是使用标准的
Cg/HLSL
编程
语言编写的。
(因此
Unity
文档里
面的
Shader
,都是指用
Shad
erLab
编写的代码)
然后我们来看下
Unity3D
自带的
60
多个
Shader
。
这些
Shader
被分为五个大类:
Normal,Tr
ansparent,Transparent Cutout,Self-llluminated,Refl
ective
。
由于数量比较多,
将分
几个
篇幅一一介绍。
(
一
) Normal
Shader Family
< br>这个家族一共
9
个
Shader
,都是针对不透明的对象的。
(1) Vertex-
Lit
:
< br>最简单的一种
Shader
之一,所有照射在该物体上的
光在一个
Pass
里面渲染完,
光源只
在顶点计算。所以不会有任何基于像素渲染得效果,比如
说:
normal
mapping,light
cookies
和
shadows.
这个
sh
ader
对模型的剖分(将一个物体从几何描述变为多边形表示的过
程)非常敏感,如果你将一个点光源放在很靠近一
个立方
体的一个顶点那里,并且对立方
体使用这个
shader
,光源只会在角落计算。基于像素光照的
shader
对剖分没有要求,在表
现圆形高光上效果也很
好。如果上述情况时你想要的效果,你可以考虑使用一个基于像素
光照
的
shader
或者增加模型的剖分。
(增加顶点数)
< br>总的来说,
这个
shader
的
渲染代价比较小。
这个
shader
包
含了
2
个
subshader
,
分别对应可编成管线和固定管线。是所有硬件都支持的
一个最基本的
shader
。如果设备支
持可编成管线,那使用可编成管线的
subsha
der
,否则使用固定管线的。
(2) Diffuse
:
Diffuse<
/p>
基于一个简单的光照模型
-Lambertian
,光照强度随着物体表面和光入射
角夹角的减小而减小
(
即光垂直于表面时强度最大
)
。光<
/p>
照的强度只和该角度有关系,和摄
像机
无关。由于这是一个基于像素光照的
shader
,因此他有这
类
shader
的优势,同时他需
要设
备支持可编程管线,如
果设备不支持,则自动使用
Vertex-Lit
这个
Shader
。
总的来说,这个
shader
渲染代价比较小。
(3) Specular
Specular
使用和
Diffuse
相同的光照模型
,但是添加了一个和观察角度相关的反
射高光。
这个被称为
p>
Blinn-Phong
光照模型。
他包含
了一个反射强光,
这个
反射高光物体
表
面角度,
光的入射角度以及观察者角度都有关系。
这种高光计算方法实际上是对实时光源模
糊反射的一种具有可行性的模拟。
模糊的等级通过
inspector
里面
Shininess
这个变量控制。
主纹理的
alpha
通道被用来当作
Specular
Map
来使用(有时候也称
gloss map
)
,
它定义了物体的反光率。纹理中
< br>alpha
里面全黑
的部分将
完全不反光(即反光率为
0%
)
。
p>
而全白的的部分反光率为
100%
。
这个
Map
在你的物体在不同的部分有不同的
反光率的时候
非常有用。比如说,锈迹
斑斑的金属会反光率低,而磨光的金属反光率比较高。口红的反
光率比皮肤高,而皮肤
的反光率比棉质衣服高。一个精心制作的
Specular
M
ap
将会让玩家
身临其境。如果目标设备不支持可编程管线,则
自动使用
Vertex-Lit
这个
S
hader
。
这个
shader
的渲染代价会比较大。
(4)Bumped Diffuse
同
Diffuse
Shader
一样,这个
Shader
基于
Lambertian
光照模型,同时使用了
p>
normal mapping
技术来增加物体表面细节。
相对于通过增加剖分来表现物体表面细节的方式,
normal map
ping
并不改变物体的形状,而是使用一张称为
Normal
Map
的特殊纹理来达到这
种效果。在
normal map
中,每个象素的颜色代表了该像素所在物体表面的法线,然后通过
这个法线(而不是通过物体模型计算而来的法线)来计算光照。可以说
< br>Normal Map
在计算
光照的过程中
“
高效地修改
”
了整个模型
。
如何创建
Normal
ma
ps
:你可以通过导入一张普通的灰度图(白
色表示凸起,
黑色表示凹进)
Unity
会自动将它转换为
Normal
Map
。
技术细节:这里使用
Normal
map
是一种
“Tangent space Normal
Map”
,
Tangent
spac
e
(正切空间)是一个跟随模型物体表面的空间。在这个空间中,
z
轴始终从表面指向外
面。
Tang
ent space Normal
Map
相对于另一种被称为
“Object space
Normal Map”
来说有点复杂,
但是他有一些优势。<
/p>
1
)可以使用在各种奇形怪状的表面
2
)便于在同一物体不同区域或者
不同物体间复用
具体关于
Tangent Space Normal
Map
和
Object Space Normal Map<
/p>
的区别,
下次
再讲。
如果调用这个
shader
失败,
则会调用
Diffuse
这个
shad
er
,
一般而言,
该
< br>shader
渲染代价低。
(5) Bumped
Specular
和
Specular
一样的光照模型,相比
Specular
而言,它使
用一张
Tangent
Space
Normal
Map
来描述物体表面
法向量的变化,来增加物体细节。
(关于
normal
map
具体见
Bumpped
Diffuse
)如果调用失败,则使用
Sp
ecular
这个
shader
,一般
而言,这个
shader
的
渲染代价会
比较大。
(6) Parallax Diffuse
Parallax
Normal mapped
与传统的
normal mapp
ed
一样,但是对
“
深度
”
的模拟
更佳。额外的深度效果是通过
Height
Map
(高度图)来实现的。
Height
Map
在
Normal map
的
p>
alpha
通道里面保存。全黑表示么有高度,而白色表示有高度。
通常这用来表现石头或者
砖块间的裂缝。
Parallax
mapping
的
技术很简单,因此会有些人工痕迹或者不太正常的效果出
现。尤其是,急剧陡峭的高低转
换在高度图里面应该避免。在
inspector
里面调
整
height
数
值来调整高度的范围,
有时候会造成物体不真实,
凌乱的情况。
因此建议使用高度变化平
缓的高度图或者将高度数值设置比较低
,让表面看起来比
较平缓。
这个
shader
的渲染代价相比
bumped diffuse
而言更大。如果调用这个
Sha
der
失败,则自动使用
Bumped
Diffuse
。
(7) Parallax
Specular
与
Bumped Spcular
相比
,
增加了一张
Height Map
来
描述深度细节。
关于
Height
Map
,见
parallax
Diffuse
。如果调用失败,则调用
Bumped Spe
cular
这个
Shader
。
(8) Decal
这个
Shader
在
unity<
/p>
文档里面的描述和
Unity3.0
有明
显的实现区别,文档由
于比较老,
07
年写的,官网下的
Built-in
Shader
里面,
decal
是使用可编程管线实现的,就<
/p>
是说,
如果你的机器不支持可编程管线,
会使用
diffuse
,
因为
diffuse
也不需要可编程
管线,
所以只能使用
vertex-l
it
。这个
Shader
除了主纹理之
外,这个
Shader
还是用了第二张纹理用
< br>来描述细节。第二张用来
Decal(
贴
花
)
的纹理使用
alpha
通道来确定是否覆盖主纹理。贴花
用的
纹理只是对主纹理的补充。
比如说你有一个砖砌的墙壁,
你可以
使用一个砖块的纹理作
为主纹理,
然
后使用带有
alpha
通道的
Deca
l
纹理在墙壁的不同地方涂鸦。
(9) Diffuse
Detail
-
-
-
-
-
-
-
-
-
上一篇:PADS Logic元器件库管理
下一篇:陶瓷术语英语词汇