天天看點

Unity Shader - ShaderLab: Legacy Lighting 舊版光照ShaderLab: Legacy Lighting

先吐槽:

  • CSDN的寫文章系統這麼渣,就因為那個自動儲存功能太渣,每10~20秒卡7秒左右,還是準備換平台寫部落格好了。我就像不懂為何這麼渣,不會去優化嗎?不會寫異步處理嗎?
  • CSDN的文章寫好後,點選釋出,彈出那個釋出頁面也是無語,每選擇一個選項,都卡5秒,你是将使用者配置的釋出屬性,每個都同步等待發送完畢(WaitingSendToServerComplete)、等待接收伺服器回報(WaitingRecieveServerResponse)嗎?不會寫異步回調處理嗎?想不懂了。
  • Unity部分說明文章太垃圾,翻譯的時候,我真的忍不住删減掉備援、啰嗦的描述。(是不是英文描述一件事物時,都是這麼啰嗦的文法?還是我們國語好啊,可惜很多前言知識都掌握在國外,希望國家越來越強大)

目錄:Unity Shader - 知識點目錄(先占位,後續持續更新)

原文:ShaderLab: Legacy Lighting

版本:2019.1

ShaderLab: Legacy Lighting

舊版光照

材質與光照參數用于控制内置的頂點光照。頂點光照是标準的Direct3D/OpenGL的計算逐頂點光照模型。Lighting on 将打開光照。光照受Material 塊,ColorMaterial 和 SparateSpecular 指令的影響。

注意:Material/Lighting 指令将會在使用了vertex programs 時失效;使用此方式的話,所有的計算将在你的vertex shader中完成。建議使用可程式設計的着色器來替代舊版的頂點光照。這樣的話你就不需要使用這些指令來描述在此了,而是使用你自己自定義的vertex and fragment programs 來使用所有的光照,紋理,與其他你想要内容。

頂點顔色與光照是渲染幾何體首先計算内容效果。它是頂點級别的操作,并在紋理應用前計算了基礎顔色。

Synatax

文法

頂級指令控制固定函數的光照與否,或是配置一些選項。主要是再 Material Block (Material塊)中設定的,詳情如下:

Color

Color color
           

設定對象的顔色。該顔色可以是RGBA值,或是一個屬性名稱使用方括号括起來。

Material

Material塊用于定義對象的材質屬性。

Lighting

Lighting On | Off
           

為了設定Material塊中的一些效果,你必須開啟光照,使用 Lighting On 指令。如果lighting 是off的話,那麼顔色就直接使用Color指令指定的顔色。

SeparateSpecular

獨立的高光()

SeparateSpecular On | Off
           

該指令将控制高光光照的開光,高光光照不受紋理影響。

ColorMaterial

ColorMaterial AmbientAndDiffuse | Emission
           

設定逐頂點顔色而不是使用Material中的顔色。AmbientAndDiffuse 替代材質的Ambient(環境光)和Diffuse(漫反射光)的值;Emission 替代材質的Emission(自發光)值。

Material Block

這包含設定材質如何對光照做出反應。下面的每個屬性都可以設定,預設我部門都是黑色(就是沒有效果的意思)。

  • Diffuse color: 漫反射顔色分量。對象的基礎顔色。
  • Ambient color: 環境光顔色分量。當對象環境光顔色,可在Light Window 中設定。
  • Specular color: 高光顔色。
  • Shininess number: 光亮度,0~1的值。0的值,你将得到大塊的高亮塊,就像漫反射光照一樣,1的值,你将得到小塊的高亮點。
  • Emission color: 自發光顔色。

對象的光照顔色計算表公式:

Ambient * Lighting Window’s Ambient Intensity setting + (Light Color * Diffuse + Light Color * Specular) + Emission

該表公式中的括号内的設定是對每個對象都生效的光照設定。

Examples

顯示純紅色:

Shader "Solid Red" {
    SubShader {
        Pass { Color (1,0,0,0) }
    }
}
           

基礎顔色是白色,并且應用了頂點光照:

Shader "VertexLit White" {
    SubShader {
        Pass {
            Material {
                Diffuse (1,1,1,1)
                Ambient (1,1,1,1)
            }
            Lighting On
        }
    }
}
           

将顔色屬性顯示在Inspector面闆中:

Shader "VertexLit Simple" {
    Properties {
        _Color ("Main Color", COLOR) = (1,1,1,1)
    }
    SubShader {
        Pass {
            Material {
                Diffuse [_Color]
                Ambient [_Color]
            }
            Lighting On
        }
    }
}
           

最後,一個完整的頂點光照shader(也可參考 SetTexture 應用頁面):

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
            }
        }
    }
}