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程序實例,而不是用頂點光照。 下訴命令在像素光照中無效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM