Unity3D Shader官方教程翻译(二)
1、Shader语法:属性
着色器可以由艺术家定义一个参数列表,这个参数值可以在Unity3D的材质检索器中查看。着色器中属性块定义了这些参数。
Properties { Property [Property ...] }
定义了1个属性块。
括号内的属性定义如下:
name ("display name", Range (min, max)) = number定义了1个float属性,范围是在min到max之间的值,可以利用检索器中对应的滑块调节他们。
name ("display name", Color) = (number,number,number,number)定义了一个颜色
name ("display name", 2D) = "name" { options }定义了1个2D纹理
name ("display name", Rect) = "name" { options }定义了1个矩形纹理属性
name ("display name", Cube) = "name" { options }定义了1个cubemap纹理属性
name ("display name", Float) = number定义了1个float
name ("display name", Vector) = (number,number,number,number)定义了1个向量,该向量由4个分量组成。
每个在Shader中的属性是依据属性的名字来引用的(在Unity3d中,通常属性名是以下划线开头)。属性的名字将在材质检索器中显示。每一个属性的默认值为等号后的值。
Range和Float属性仅仅是1个数字。
Color和Vector属性由4个数字组成。
纹理属性(2D,Rect,Cube)的默认值是1个字符串,或者是默认的内置纹理:"白色","黑色","灰色","凸点"。
要在Shader编程中访问属性可以用属性名加方括号来访问如:[name];
Properties { // properties for water shader _WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders滑块 _ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5 _RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4 _RefrColor ("Refraction color", Color) = (.34, .85, .92, 1) // color颜色 _ReflectionTex ("Environment Reflection", 2D) = "" {} // textures纹理 _RefractionTex ("Environment Refraction", 2D) = "" {} _Fresnel ("Fresnel (A) ", 2D) = "" {} _BumpMap ("Bumpmap (RGB) ", 2D) = "" {} }纹理属性的花括号内的选项是可选的。可用的选项是:
TexGen texgenmode 纹理坐标自动生成模式
纹理坐标自动生成模式。可以是ObjectLinear,EyeLinear , SphereMap, CubeReflect,CubeNormal之一,这些直接对应到OpenGL texgen模式的。注意:如果使用自定义的顶点程序,TexGen被忽略。
LightmapMode 光照模式
如果给定的,这种纹理将受到预渲染的光照参数影响。也就是说,这种纹理的使用效果不是取决于材质,而是取决于渲染设置。详情请参考渲染脚本文件。
// EyeLinear texgen mode example Shader "Texgen/Eye Linear" { Properties { _MainTex ("Base", 2D) = "white" { TexGen EyeLinear } } SubShader { Pass { SetTexture [_MainTex] { combine texture } } } }
2、SubShader
每个在Unity3D的shader都是由一系列的的subshaders组成的。当Unity3D显示一个网格的时候,它会使用第一个被用户显卡支持的subshader。
Subshader { [Tags] [CommonState] Passdef [Passdef ...] }
定义subshade包含了可选的标签,常见的状态和通道定义列表。
一个subshader定义了1个渲染通道列表,并有选择地设置了这些通道的通常状态。此外,subshade也可以设置特定的标签。
当Unity3D选择1个subshader进行渲染的时候,他将优先渲染1个被每个通道所定义的对象(这个对象很可能是由光线交互决定的)。由于渲染每1个物体是个十分昂贵的操作,你得定义Shader可能操作的渲染通道数目尽可能的少。当然有时候某些华丽的效果在显卡上不可能只使用单通道,你就必须得使用多通道了。
每个通道的定义可以是1个regular Pass, 或 Use Pass 或 Grab Pass.
在一个通道定义中的任何声明,也可以出现在Subshader块。这样做能使所有的通道都能共享这些声明。
// ... SubShader { Pass { Lighting Off SetTexture [_MainTex] {} } } // ...
这个subshader定义了1个单通道,这个单通道关闭了所有的灯光然后显示了1个名字叫_MainTex的纹理网格。
转自:http://www.j2megame.com