Unity3d Shader

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)) = number
Color
    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) = number
Vector
    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程序实例,而不是用顶点光照。 下诉命令在像素光照中无效。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。