- 最后登录
- 2014-10-23
- 注册时间
- 2011-7-19
- 阅读权限
- 90
- 积分
- 81303
- 纳金币
- -1
- 精华
- 11
|
现在我们已经定义了四个性质,可以开始撰写实际的shader了
在开始以前,先了解shader的结构是如何定义的。
不同的绘图卡有不同的能力,例如:有的绘图卡支援fragment programs但有些没有,有些可以
一次处理四个贴图?(four textures)其他的可能只能处理两个或一个,为了要符合所有用户的硬体需
求,一个shader可以包涵多个SubShaders,当unity在运算shader时,它将详细察看所有的
subshaders而且使用硬体可支持的第一个。
5
Shader "S***cture Example" {
Properties { /* ...shader properties... }
SubShader {
// ...subshader that uses vertex/fragment programs...
}
SubShader {
// ...subshader that uses four textures per pass...
}
SubShader {
// ...subshader that uses two textures per pass...
}
SubShader {
// ...subshader that might look ugly but***ns on anything : )
}
}
Shader "S***cture Example" {
Properties { /* ...shader properties... }
SubShader {
// ...subshader that uses vertex/fragment programs...
}
SubShader {
// ...subshader that uses four textures per pass...
}
SubShader {
// ...subshader that uses two textures per pass...
}
SubShader {
// ...subshader that might look ugly but***ns on anything : )
6
}
}
此系统提供unity可以支援现有所有的硬体并取得最佳的品质。它作到了,然而,结果是必须撰写
很长的shaders语法
在每一个SubShader block,你可以设定彩现途径的状态;并定义彩现途径本身。完整的
SubShader语法请参照SubShader Reference章节
每个subshader等于是一个途径集。要对几何物件进行彩现,至少一定要有一个途径,内定的
VertexLit shader里面仅有一个途径:
view plaincopy to clipboardprint?
// ...snip...
Pass {
Material {
Diffuse [_Color]
Ambient [_Color]
Shininess [_Shininess]
Specular [_SpecColor]
Emission [_Emission]
}
Lighting On
SeperateSpecular On
SetTexture [_MainTex] {
constantColor [_Color]
Combine texture * primary DOUBLE, texture * constant
}
}
// ...snip...
// ...snip...
7
Pass {
Material {
Diffuse [_Color]
Ambient [_Color]
Shininess [_Shininess]
Specular [_SpecColor]
Emission [_Emission]
}
Lighting On
SeperateSpecular On
SetTexture [_MainTex] {
constantColor [_Color]
Combine texture * primary DOUBLE, texture * constant
}
}
// ...snip...
通过指令可以定义一个特殊的方法,用来驱动绘图硬体彩现指定的几何物件
例如:上方语法中有一个Material block,定义了照明时所需要几项固定参数。而指令Lighting
On用来开启该照明设备,而SeperateSpecular On则是启用Seperate作为特殊镜射效果。
到目前为止的所有命令,皆属于支援OpenGL/Direct3D技术硬体本身可使用的固定功能,您可以
参考OpenGL红皮书,可以找到更多相关资料。
下一个命令是SetTexture,这是个非常重要的命令,这个命令可以定义影像纹理如何混合、组合
以及如何运用于我们的彩现环境里,SetTexture通常跟随于纹理的属性名称之后(我们在这里使用
_MainTex ),接下来的combiner block也是定义纹理的应用方式,这个combiner block的命令会
在萤幕显示每一个被执行的动作。
在这个block内我们设定了一个颜色值,并命名为_Color,我们会在后面使用这个颜色
8
在下个命令,我们指定如何混合纹理以及颜色值。我们用Combine命令来混合其他纹理或颜色,
看起来像下面这样:
Combine ColorPart, AlphaPart
在这里ColorPart与AlphaPart定义了混合的颜色(RGB)以及alpha值(A)个别的资料,假如
AlphaPart被省略了,那它将与ColorPart的资料作混合
在我们的VertexLit范例中:
Combine texture * primary DOUBLE, texture * constant
这里的texture来源是当前的纹理(_MainTex),它将与主要的颜色互相搭配(*),主色为照明设备
的颜色,它是由Material计算出来的结果。最终是这两个倍增后的结果会增加照明强度.
aplha值(在逗号以后)是由constantColor倍增而得的结果。另一个常用的混合模式称为previous
(在这个shader未使用),这是所有previous SetTexture的结果,并且可以用来混合多种纹理和颜
色。
|
|