-
Unity3D Built-in
Shader
详解一
Unity3D
的
Shader
Unity
里面的
Shaders
是使用一种叫
ShaderLab
p>
的语言编写的,它同微软的
.FX
文件或者
NVIDIA
的
CgFX
有些类似。传统意义上的
vertex
shader
和
pixel shader
还是使用标准的
Cg/HLSL
编程
语言
编写的。
(
因此
< br>Unity
文档里面的
Shader
,
都是指用
ShaderLab
编
写的代码)
然后我们来看下
Unit
y3D
自
带
的
60
多个
Shader
。
这
些
Shader
被
分为五
个大
类:<
/p>
Normal,Transparent,Transparent
Cutout,Self-llluminated,Reflective
。由于数量比较多,将分几个篇幅一一介绍。
(
一
)
Normal
Shader
Family
这个家族一共
9
个
Shader
,
都
是针对不透明的对象的。
(1)
Vertex-
Lit
:
最简单的一种
Shader
之一,所有照射在该物体上的光在一个
Pass
里面渲染完,光源只在顶点计算。
所以不会有任何基于
像素渲染得效果,比如说:
normal mapping,light cookie
s
和
shadows.
这个
shader
对模型的剖分(将一个物体从几何描述变为多边形表示的过程
)非常敏感,如果你将一个点
光源放在很靠近一个立方体的一个顶点那里,并且对立方体
使用这个
shader
,光源只会在角落计算。
基于像素光照的
shader
对剖分没有要求,在表现
圆形高光上效果也很好。如果上述情况时你想要的
效果,
你可以
考虑使用一个基于像素光照的
shader
或者增加模型的剖分
。
(增加顶点数)
总的来说,
这个
shader
的渲染代价比较小。这个<
/p>
shader
包含了
2
< br>个
subshader
,分别对应可编成管线和固定管<
/p>
线。是所有硬件都支持的一个最基本的
shader
。如果设备支持可编成管线,那使用可编成管线的
subshader
,否则使用固定管线的。
(2)
Diffuse
:
Diffuse
基
于一个简单的光照模型
-Lambertian
,光照强度随着
物体表面和光入射角
夹角的减小而减小
(
即光垂直于表面时强度最大
)
。
光照
的强度只和该角度有关系,
和摄像机无关。由
于这是一个基于像
素光照的
shader
,
因此他有这类
shader
的优势,
同时他需要设备
支持可编程管线,
如果设备不支持,则自动使用
Vertex-
Lit
这个
Shader
。
总的来说,这个
shader
< br>渲染代价比较小。
(3)
Specular
Specular
使用和
Diffu
se
相同的光照模型,但是添加了一个和观察角度相关的反射高
光。这个被称为
Blinn-Phong
光照模型。他包含了一
个反射强光,
这个反射高光物体表面角度,
光的
入射角度以及观察者角度都有关系。
这种高光计算方法实际上是对实时光源模糊
反射的一种具有可行
性的模拟。模糊的等级通过
inspect
or
里面
Shininess
这个变量
控制。
主纹理的
alpha
通道被用来
当作
Specular
Map
来使用(有时候也称
gloss map
)
,
它定义了物体的反光率。纹理中
< br>alpha
里面全
黑
的部分将完全不反光(即反光率为
0%
)。
p>
而全白的的部分反光率为
100%
。这个<
/p>
Map
在你的物体在
不同的部分有不同的
反光率的时候非常有用。比如说,
锈迹斑斑的金属会反光率低,而磨光的金属反
光率比较高。口红的反光率比皮肤高,而皮肤的反光率比棉质衣服高。一个精心制作的
Specular
Map
将会让玩家身临其境。
如果目标设备不支持可编程管线,则自动使用
Vertex-Lit
这个
Shader
。
这
个
shader
的渲染
代价会比较大。
(4)Bumped Diffuse
同
Diffuse Shader
一样
,这个
Shader
基于
Lamber
tian
光照模型,同时使用了
normal
mapping
技术来增加物体表面细节。
相对于通过
增加剖分来表现物体表面细节的方式,
normal
mapp
ing
并不改变物体的形状,
而是使用一张称为
Normal
Map
的特殊纹理来达到这种效果。<
/p>
在
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
和
Specula
r
一样的光照模型,
相比
Specul
ar
而言,
它使用一张
Tangent
Space
Normal Map
来
描述物体表面法向量的变化,来增加物体细节。(关于
normal
map
具体见
Bumpped
Dif
fuse
)如果调用失败,则使用
Specular
这个
shader
,一般而言,这个
shader
的渲染代价会比较
大。
(6) Parallax Diffuse
Parallax Normal
mapped
与传统的
normal mapped
一样,但是对“深度”的
模拟更佳。额外的深度效果是通过
Height
Map
(高度图)来实现的。
Height
Map
在
Normal map
的
p>
alpha
通道里面保存。全黑表示么有高度,而白色表示有高度。
通常这用来表现石头或者砖块间的裂
缝。
Parallax
mapping
的技术很简单,因此会有些人工痕迹或者不太正常的效果出现。尤其是,
急
剧陡峭的高低转换在高度图里面应该避免。在
inspect
or
里面调整
height
数值来调整
高度的范围,
有时候会造成物体不真实,
凌乱的情况。
因此建议使用高度变化平缓的高度图或者将高度数值设置比
较低,让表面
看起来比较平缓。
这个
shader
的渲染代价相比
bumped diffuse
而言更大。如果调用
这个
Shader
失败,则自动使用
Bumped
Diffuse
。
(7) Parallax Specular
与
Bumped
Spcular
相比,增加了一张
Height
Map
来描述深度细节。关于
Height
Map
,见
parallax
Diffuse
。如果调用失败,则调用
Bumped Spe
cular
这个
Shader
。
(8) Decal
这个
Shade
r
在
unity
文档里面的描述和
p>
Unity3.0
有明显的实现区别,文档由于比较老,
07
年写的,官网下的
Built-in
Shader
里面,
decal
是使用可编程管线实现的,就是说,如果你的机
器不支持可编程管线,
会使用
diffuse
,
因为
diffuse
也不需要可编程管线,
所以只能使用
vertex-lit
。
这个
Shader
除了主纹理之外,
< br>这个
Shader
还是用了第二张纹理用来描述细节。<
/p>
第二张用来
Decal(
贴
花
)
的纹理使用
alpha
通道来确定是否覆盖主纹理。贴花用的纹理只是对主纹理的补充。比如说你有
一个砖砌的墙壁,
你可以使用一个砖块的纹理作为主纹理,
然后使用带有
alpha
通道的
Decal
纹理在
墙壁的不同地方涂鸦。
(9) Diffuse Detail
这是一个普通的
diffuse shader
加上一些额外数据的
shader
。它允许你定义
p>
第二张纹理,称为
Detail
Text
ure
。当
camera
靠近的时候,
Detail
Texture
逐渐显
示出来,一般用
于地形。比如说,当你使用一张低分辨率的纹理拉升到整个地形上的时候
。随着
camera
逐渐拉近,
低分辨
率的纹理开始模糊,这不是我们想要的效果。为了避免这个效果,创建一张
Detail
纹理会将
地形
tile
化。在这种模式下,随着
camera
逐渐拉近,额外
的细节将会出现以避免出现模糊的效果。
Detail
p>
纹理是覆盖在主纹理上面的。
Detail
纹理中深色的部分将会使得主纹理变深,而淡色的部分
将会使主纹理变亮,
Detail
纹理通常是浅灰色。
(
与
Decal
里面
Decal
纹理不同的是,
Decal
纹理是
p>
RGBA
,通过
alpha
控制
Decal
Texture
与
Main Texture
< br>的融合,而
Detail
的纹理是
RGB
,直接是两
张纹理的
rgb<
/p>
通道分别相乘再
*2
,
< br>就是说,
Detail
纹理中颜色数值
< br> =
0.5
不会改变主纹理颜色,
>0.5
会变亮,
<0.5
加深<
/p>
)
Unity Built-in
Shader
详解二
这次主要讨论<
/p>
Unity
自带的
Shader
中
Transparent Shader Family
这个家族的
Shader
一共
7
种
,
原理和类型与
Normal
中的上差
不多,
只不过这些
Shader
是用<
/p>
在半透明或者全透明的物体上面的。
他们的主纹理接受
RGBA4
个通道。
如果你的模型一部分是半透明
,
一部分是不透明的。请分开使用两张材质,半透明的材质这个家族的
< br>Shader
。这个家族的
Shader
的
内容和
Normal
中同名
的几乎一样,只是添加了半透明效果,因此不再做重复介绍。
通过读取纹理中的
al
pha
值,
这个
Transparen
t
家族的
shader
可以让模型变成
半透明或者全
透明的。在
alpha
中
,
0
表示全透明,
255
表示全白。如果你的主纹理不包含
alpha
通道,
那么这个
物体将会变成不透明的。
在游戏中使用半透明的物体是比较有技巧性的,
因为他们经常会导致排序问题。比如说,如
果你透过两个窗口观察物体,
发觉物体很异样,
恭喜你,你正在经历着每个人都会遇到的使用半透明
对象的问题。
一条具有普遍性的规则是:
有些时
候一个半透明的对象会很诡异的绘制在另外一些对象
前面,尤其当这些对象是互相交叉的
,
或者一个把另一个包围的抑或是。为此,当你需要半透明对象
-
-
-
-
-
-
-
-
-
上一篇:高中化学总复习有机化学经典例题
下一篇:常用医学名词前缀