Shader 學(xué)習(xí)之路-表面著色器(四)

表面著色器官方文檔:https://docs.unity3d.com/Manual/SL-SurfaceShaders.html

1、定義:對(duì)頂點(diǎn)著色器和片元著色器進(jìn)一層封裝,主要部分為兩個(gè)結(jié)構(gòu)體(Input、SurfaceOutput)和編譯指令。

2、編譯指令:指明表面著色器使用表面的函數(shù)和光照函數(shù),并設(shè)置可選參數(shù)

#pragma surface surfaceFunction lightModel [optionalparams]

表面函數(shù)(SurfaceFunction):包含屬性友反射率、光滑度、透明度等,使用輸入結(jié)構(gòu)體Input 來(lái)設(shè)置各種屬性。

光照函數(shù):使用表面函數(shù)來(lái)模擬光照效果,Unity內(nèi)置基于物理的光照模型Standard 和

StandardSpecular,非物理光照模型函數(shù)Lambert 和 BlinnPhong。

其他可選參數(shù):

自定義修改函數(shù):

vertex:VertexFunction:頂點(diǎn)修改,實(shí)現(xiàn)一些頂點(diǎn)動(dòng)畫(huà)等

finalcolor:ColorFunction:最終顏色修改、實(shí)現(xiàn)霧效

finalgbuffer:ColorFunction:延遲渲染修改,實(shí)現(xiàn)邊緣檢測(cè)等

finalprepass:ColorFunction:Prepass base修改

陰影:

addshadow:添加一個(gè)陰影投射Pass,一般FallBack 通用的光照模式可以找到,對(duì)于頂點(diǎn)動(dòng)畫(huà)、

透明度需要特殊處理。

fullforwardshadows:在前向渲染路徑支持所有光源類(lèi)型的陰影,默認(rèn)是只有平行光,添加這個(gè)參數(shù)可以讓點(diǎn)光火聚光燈友陰影渲染。

noshadows:取消所有陰影。

透明度混合測(cè)試:

alpha、alpha:auto:透明測(cè)試

alpha:blend 透明混合

alphatest:VariableName:VariableName 用來(lái)剔除不滿(mǎn)足的片元

光照:

noambient:不應(yīng)用任何環(huán)境光照或者光照探針(light probe)

novertexlights:不應(yīng)用逐頂點(diǎn)光照

noforwardadd:去掉所有前向渲染的額外pass,即支持逐像素平行光,其他光源用逐頂點(diǎn)或者陰影計(jì)算。

控制代碼生成:

exclude_path:deferred,exclude_path:forward,exclude_path:prepass 不需要為特定渲染路徑生成代碼。

3、兩個(gè)結(jié)構(gòu)體

Input 結(jié)構(gòu)體

包含主紋理和法線紋理的采樣坐標(biāo)uv_MainTex 和 uv_BumpMap


SurfaceOutput:存儲(chǔ)表面屬性結(jié)構(gòu)體,作為光照函數(shù)輸入來(lái)計(jì)算光照

// Lighting.cginc中定義

struct SurfaceOutput

{

? ? fixed3 Albedo;? // diffuse color

? ? fixed3 Normal;? // tangent space normal, if written

? ? fixed3 Emission;

? ? half Specular;? // specular power in 0..1 range,高光反射指數(shù)部分。

? ? fixed Gloss;? ? // specular intensity,高光反射強(qiáng)度系數(shù)。

? ? fixed Alpha;? ? // alpha for transparencies

};

// UnityPBSLighing.cginc中定義

struct SurfaceOutputStandard

{

? ? fixed3 Albedo;? ? ? // base (diffuse or specular) color

? ? fixed3 Normal;? ? ? // tangent space normal, if written

? ? half3 Emission;

? ? half Metallic;? ? ? // 0=non-metal, 1=metal

? ? half Smoothness;? ? // 0=rough, 1=smooth

? ? half Occlusion;? ? // occlusion (default 1)

? ? fixed Alpha;? ? ? ? // alpha for transparencies

};

struct SurfaceOutputStandardSpecular

{

? ? fixed3 Albedo;? ? ? // diffuse color

? ? fixed3 Specular;? ? // specular color

? ? fixed3 Normal;? ? ? // tangent space normal, if written

? ? half3 Emission;

? ? half Smoothness;? ? // 0=rough, 1=smooth

? ? half Occlusion;? ? // occlusion (default 1)

? ? fixed Alpha;? ? ? ? // alpha for transparencies

};

4、表面著色器的渲染流水線




5、表面著色器的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):表面著色器是在頂點(diǎn)-幾何-片元著色器上層的抽象封裝,不需要寫(xiě)復(fù)雜的代碼,直接定義好相關(guān)的參數(shù)和編譯指令就可以實(shí)現(xiàn)需要的效果。

缺點(diǎn):表面著色器必須按照它的規(guī)則去寫(xiě)代碼,自由度不高,而且內(nèi)部生成的頂點(diǎn)-幾何-片元著色器也不是最優(yōu)的,往往會(huì)產(chǎn)生性能上面的問(wèn)題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 八點(diǎn)鐘,風(fēng)聲未醒 換季的風(fēng)鈴再也搖不動(dòng)屋檐瓦棟 雨聲垂直的滴落,濕了好幾回年輕 誰(shuí)的童言無(wú)忌在湖上搖蕩 我的思緒往...
    曾昭閱讀 316評(píng)論 3 1
  • 我想還是寫(xiě)篇日記吧 昨晚睡前他們問(wèn)我去不去爬銅鼓嶂,我想了想,還是去了,畢竟那么懶去鍛煉 記得去年登高之時(shí)陽(yáng)光明媚...
    peng格林T閱讀 268評(píng)論 0 1
  • 以2010為界限劃定年份 是2010年以后的機(jī)票么?金幣侍從-,否定 機(jī)票為2010年以前(這里沒(méi)有劃定是否包含2...
    Gin_堇閱讀 238評(píng)論 0 0
  • 每次拜讀經(jīng)典書(shū)籍的時(shí)候,崇敬之心油然而生。每一部經(jīng)典都具備豐富的內(nèi)涵,而且作者無(wú)不是在人生中,遭遇凄慘跌蕩中獲得寫(xiě)...
    本能發(fā)動(dòng)閱讀 442評(píng)論 0 0

友情鏈接更多精彩內(nèi)容