Unity3D Shader官方教程翻譯(三)


Unity3D Shader官方教程翻譯(三)


1、Shader語法:Pass

1個Pass塊可以使一個幾何物體被一次渲染。

Pass { [Name and Tags] [RenderSetup] [TextureSetup] }
最基礎的pass命令包含有1個可選的渲染設置命令列表,及1個可選的可用紋理列表。


Name and tags

一個Pass 可以定義它的名字和任意數量的標簽-name/value 字符串 將Pass的含義告訴給渲染引擎。

Render Setup 渲染設置

Pass設置了一系列的顯卡狀態,比如說alpha混合是否開啟,是否允許霧化等等。 這些命令有:

Material { Material Block } 材質
定義了1個頂點光照管道使用的材質。

Lighting On | Off 開啟關閉燈光

關閉或開啟頂點光照。


Cull Back | Front | Off  裁剪背面|前面|關閉
設置多邊形的裁剪模式。


ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always)
設置深度測試模式


OpenGL 深度其實就是該象素點在3d世界中距離攝象機的距離,深度緩存中存儲着每個象素點(繪制在屏幕上的)的深度值!深度測試決定了是否繪制較遠的象素點(或較近的象素點),通常選用較近的,而較遠優先能實現透視的效果!


ZWrite On | Off
設置深度寫模式類型


Fog { Fog Block }
設置霧化參數


AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue
開啟Alpha測試


Blend SourceBlendMode DestBlendMode
設置Alpha混合模式

Color Color value
設置顏色,當頂點光照關閉時候有效。


ColorMask RGB | A | 0 | any combination of R, G, B, A
設置顏色遮罩模式。將ColorMask設置為0表示關閉所有渲染的顏色管道。


Offset OffsetFactor , OffsetUnits
設置深度偏移。提示:這個命令僅接受Unity3 3D的常數參數(不是Shader的參數)。
用於為圖形設置深度的偏移
這個函數一般用於當兩圖形剛上處於同坐標或兩個面在同一坐標重疊時。可以通過這個函數讓其中一個圖形或面的坐標自動偏移。 
在許多實現方法中為了節省重繪深度圖所花費的時間,可以只對場景中的一部分物體進行渲染來生成陰影圖。另外,為了解決當前深度值與下一步繪制的表面深度太接近產生的深度沖突問題(Z-fighting),也可能在陰影圖渲染過程中對物體的照明深度添加一個偏移。實現這種效果的另外一種可選方法是裁剪掉前面的物體,僅對后面的物體進行渲染生成陰影圖。


SeparateSpecular On | Off
關閉或打開頂點照明單獨的鏡面反射光的顏色。

ColorMaterial AmbientAndDiffuse | Emission 環境和漫反射|放射
計算頂點照明時使用的每個頂點顏色

Texture Setup 紋理設置
當渲染狀態設置以后,你可以用SetTexture命令指定這些紋理和他們的結合方式。

SetTexture texture property { [Combine options] } 設置紋理
紋理設置固定功能的多紋理管線,如果使用定制的片斷着色器將被忽略。

Per-pixel Lighting 逐像素光照
逐像素光照管道的工作依賴於渲染對象在多個pass中。Unity3D一旦獲得環境光和任何頂點的光照就開始渲染物體。然后,它在一個單獨添加的pass中影響渲染的物體每1個光照的像素。

Per-vertex Lighting 逐頂點光照
逐頂點光照是Direct3d/OpenGl的標准光照模式,它的計算依賴於每一個頂點。打開光照后才能啟動逐頂點光照。光照受Materialblock, ColorMaterial 和 SeparateSpecular命令影響。 

2、Shader語法:Pass的Color, Material, Lighting
材質和照明參數是用來控制內置的頂點光照。頂點光照是Direct3D/OpenGL的標准照明模型,它計算每一個頂點。Lighting on命令打開它。光照受Material block,ColorMaterial和SeparateSpecular命令影響

逐像素光照 通常是實現自定義的頂點/片斷程序,它不使用頂點照明。這篇文章中描述的任何命令都不會用來操作逐像素光照,你可以通過自己定義的頂點和片段編程來實現這個效果。



當渲染任何幾何圖形時候,頂點顏色和光照是第1個被計算的效果。在紋理應用之前,它首先操作頂點層級,然后計算基礎顏色。

Shader "VertexLit" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {
        Pass {
            Material {
                Diffuse [_Color]
                Ambient [_Color]
                Shininess [_Shininess]
                Specular [_SpecColor]
                Emission [_Emission]
            }
            Lighting On
            SeparateSpecular On
            SetTexture [_MainTex] {
                Combine texture * primary DOUBLE, texture * primary
            }
        }
    }
} 


3、Shader語法:Pass的Culling & Depth Testing


面剔除是1個可選項,不被觀眾觀察到的多邊形面它不會去渲染。所有的多邊形都包含1個正面和背面。剔除常用於剔除那些遠離你的面,比如說背面通常情況下你是看不見的。所以通常情況下是剔除背面,但是你也可以選擇剔除正面。

另外一個使物體渲染看起來正常的是深度測試。深度測試確定在場景中只繪制物體離觀察者最近的表面。

Cull Back | Front | Off  剔除 面 正面 關閉 
控制哪邊的面被剔除(不被繪制) 
不去渲染觀察者看不到的背面。
不去渲染觀察者能看的到得正面。常用於由內而外顯示物體。
關閉剔除,所有面都可見,用於一些特殊效果。
 
ZWrite On | Off 
控制是否將物體的像素寫入深度緩沖中(默認的是開啟)。如果你想繪制某個固定物體,這里無用請不要看了。如果你想繪制半透明效果,請關閉ZWrite,詳情請見后面。 
  
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always 
控制深度測試如何進行。默認是LEqual(依據現有對象的距離繪制對象,隱藏小於設置的值的對象)。 
  
Offset Factor , Units  深度偏移 
允許你指定深度偏移的2個參數。factor和units, Factor 設置Z的最大斜率,關於多邊形的X或Y。 units設置最小可分辨深度緩沖的值。當2個多邊形在同一深度時候,這個可以強制設定一個多邊形比另外1個多邊形優先繪制。舉例 ,offset 0,-1可以強制多邊形更接近攝像頭(忽略多邊形的斜率)。offset -1,-1 在掠射角時候,將更加使多邊形接近攝像頭。

Shader "Show Insides" {
    SubShader {
        Pass {
            Material {
                Diffuse (1,1,1,1)
            }
            Lighting On
            Cull Front
        }
    }
} 
Shader "Reveal Backfaces" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" { }
    }
    SubShader {
        // Render the front-facing parts of the object.
        // We use a simple white material, and apply the main texture.
        Pass {
            Material {
                Diffuse (1,1,1,1)
            }
            Lighting On
            SetTexture [_MainTex] {
                Combine Primary * Texture
            }
        }
        // Now we render the back-facing triangles in the most
        // irritating color in the world: BRIGHT PINK!
        Pass {
            Color (1,0,1,1)
            Cull Front
        }
    }
} 
Shader "Simple Glass" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
        _MainTex ("Base (RGB)", 2D) = "white" { }
    }
    SubShader {
        // We use the material in many passes by defining them in the subshader.
        // Anything defined here becomes default values for all contained passes. 任何在這里定義的東西都會成為默認值(對所有passes有效)。
        Material {
            Diffuse [_Color]
            Ambient [_Color]
            Shininess [_Shininess]
            Specular [_SpecColor]
            Emission [_Emission]
        }
        Lighting On
        SeparateSpecular On
        // Set up alpha blending 設置alpha混合
        Blend SrcAlpha OneMinusSrcAlpha
        // Render the back facing parts of the object.
        // If the object is convex, these will always be further away
        // than the front-faces.        // 如果物體是凸面物體,這些將比前表面更遠
        Pass {
            Cull Front
            SetTexture [_MainTex] {
                Combine Primary * Texture
            }
        }
        // Render the parts of the object facing us.
        // If the object is convex, these will be closer than the
        // back-faces.
        // 如果物體是凸面物體,這些將比后表面更近
         Pass {
            Cull Back
            SetTexture [_MainTex] {
                Combine Primary * Texture
            }
        }
    }
} 

4、Shader語法:Pass的紋理處理

紋理處理是在做舊式的合並效果。你可以在1個pass中使用多個SetTexture命令--所有的紋理都在一個隊列當中,就像多個圖層在1個繪圖程序中一樣。SetTexture 命令必須處在Pass的末尾。

這個小例子,有兩個紋理。首先,它設置首次合成只采用_MainTex,然后是使用_BlendTex的alpha通道進行_BlendTex的RGB顏色褪色


Shader "Examples/2 Alpha Blended Textures" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _BlendTex ("Alpha Blended (RGBA) ", 2D) = "white" {}
    }
    SubShader {
        Pass {
            // Apply base texture 設置基礎紋理
            SetTexture [_MainTex] {
                combine texture
            }
            // Blend in the alpha texture using the lerp operator 使用插值操作混合alpha紋理
            SetTexture [_BlendTex] {
                combine texture lerp (texture) previous
            }
        }
    }
}
這個shader使用的的_MainTex的alpha分量去決定在哪應用照明。它分兩個階段來實現這個效果。在第一階段,紋理的alpha值用於混合頂點顏色和白色固體。在第二階段中,再乘以紋理的RGB值。

Shader "Examples/Self-Illumination" {
    Properties {
        _MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
    }
    SubShader {
        Pass {
            // Set up basic white vertex lighting
            Material {
                Diffuse (1,1,1,1)
                Ambient (1,1,1,1)
            }
            Lighting On
            // Use texture alpha to blend up to white (= full illumination)使用紋理alpha和白色混合
            SetTexture [_MainTex] {
                constantColor (1,1,1,1)
                combine constant lerp(texture) previous
            }
            // Multiply in texture
            SetTexture [_MainTex] {
                combine previous * texture
            }
        }
    }
}

轉自:http://www.j2megame.com
关注微信公众号

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com