Unity3d Shader 预览
Surface Shader主要用来实现光照相关处理,可能更简洁。 Vertex and Fragment Shader 如果不与光照交互, 则可以用这个shader,更录活 fixed function shaders 固定shader主要用于老旧卡 ShaderLab 不管写哪种shader,最终通过shaderLab实现,其组织结构如下: Shader "MyShader" { Properties{ _MyTexture ("My Texture",2D) = "white" {} // other properties like colors or vectors go here as well } SubShader{ // here goes the 'meat' of your // - surface shader or // -vertex and fragment shader or // -fixed function shader } SubShader{ // here goes a simpler version of the subshader above that can run older graphic cards }}开始以下学习前,先简单了解一下shaderlab指南======================================================================ShaderLab 语法: Shader语法: Shader "名字" {[Properties] Subshaders [Fallback]} []--可选项目 Properties Shader可以有多个属性(properties),每一个属性都显示在Unity的inspector. 如颜色,贴图,或者任意值 Subshaders & Fallback 每个shader包含多个子shader, 至少包含有一个。当加载shader时, Unity会遍历所有子shader.从上往下选择第一个可以支持的。 如果没有可以支持的, Unity会试着用Fallback shader. 如下就是一个最简单的shader // colored vertex lighting Shader "Simple colored lighting" { // a signle color property Properties { _Color ("Main Color", Color) = (1,.5,.5,1) } // define one subshader SubShader{ Pass { Material{ Diffuse [_Color] } Lighting On } }}subshader中包含了一个通道(Pass), 它开启了顶点光,并设置基本材质。ShaderLab 语法:Properties语法: Properties {Property [Property ...] }定义 属性块,位于括号中的定义如下:Float Range name ("diplay name", Range(min, max)) = numberColor name ("diplay name", Color) = (number, number, number, number)Texture 2D name ("diplay name", 2D) = "name" { options }Rectangle name ("diplay name", Rect) = "name" { options }Cubemap name ("display name", Cube) = "name" {options}Float name ("display name", Float) = numberVector name ("display name", Vector) = (number, number, number, number)例子如下: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) = "" {}}贴图选项贴图属性的选项位花括号中,是可选的,可选项目如下:1.TexGen 模式,自动贴图坐标生成模式。可以为ObjectLnear, EyeLinear,Shperemap, CubeReflect,CubeNormal之一。这些对应于OpenGL中相应的texgen模式。ShaderLab 语法:SubShader语法: SubShader { [Tags] [CommonState] Passdef [Passdef ...] }一个SubShader可以定义一组渲染通道,可选设置共同状态针对所有通道,也可以指定标签当Unity确实使用那个SubShader时,它会用该Subshader每个通道一一给对象进行渲染,每一次渲染是一个比较昂贵的操作。尽可能的少用通道。例子如下:// ...SubShader { Pass { Lighting Off SetTexture [_MainTex] {} }}// ...ShaderLab 语法:Pass语法: Pass {[Name and Tasgs\] [RenderSetup\] [TextureSetup]}基本通道命名包含一个可能的渲染设置命令。 以及接着一个可选的一组使用贴图Name and Tags一个通道可能定义它的名字 和 任意个数标签(key/value队,用于进行通道与引擎间交互)。Rander Setup通道设置多个图形硬件状态,如打开alpha混合, 使用雾。等等, 命令如下:Material Material { Material Block}定义一个用在顶点光照管线的材质。 见【Material page】Lighting Lighting On | Off打开|关闭顶点光照. 见【Material page】Culling Cull Back | Front | Off设置多边形拣选模式.见【 Cull and Depth page 】ZTest ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual)设置深度检测模式.见【 Cull and Depth page 】ZWrite ZWrite On | Off设置深度写模式.见【 Cull and Depth page 】Fog Fog {Fog Block}设置雾参数。见【Fog page 】AlphaTest AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual)打开Alpha测试。见【Alpha Testing page】Blend Blend SourceBlendmMode DestBlendMode设置混合模式。见【 Blending page】Color Color Color-value在顶点光照打开时,选用的顶点颜色.见【Material page】ColorMask ColorMask RGB | A | 0 | any combinaion of R,G,B,A设置颜色写入mask, 0,表示关闭所有颜色通道写入.见【Material page】Offset Offset OffsetFacotr, OffsetUnits设置Z深度缓冲偏移.见【 Cull and Depth page 】SeperateSpecular SeperateSpecular On | Off打开|关闭顶点光照的分隔高光.见【Material page】ColorMaterail ColoerMaterial AmbientAndDiffuse | Emission使用每一个顶点光,当在计算顶点光照时。见【Material page】Texture Setup在渲染状态设置后,你可能指定一定数量的贴图和它们的组合模式,通过SetTexture进行应用ShaderLab 语法:Color,Material,Lighting材质与光照参数用来控件内建顶点光照。顶点光照是标准的D3D/OPENGL光照模式,它为每个顶点逐一计算。Lighting On 打开顶点光照,光照受到Material block,ColorMaterail,SeperateSpecular命令影响。像素光照通常用自定义vertex/fragment程序实例,而不是用顶点光照。 下诉命令在像素光照中无效。