Unity_Shader著色器(表面著色器)

Shader"Custom/Third"{

Properties{

_Color("MainColor",Color)?=?(1,1,1,1)

_MainTex("Albedo(RGB)",2D)?="White"{}

//光滑度

_Glossiness("Smoothness",Range(0,1))?=0.5

//金屬光澤度

_Metallic("Metallic",Range(0,1))?=0.0

}

SubShader{

//表面著色器可以被若干個(gè)標(biāo)簽所修飾,通過判斷標(biāo)簽來決定硬件什么時(shí)候該調(diào)用著色器、

//“RendererType”="Opaque"表示渲染不透明的物體

//RendererType賦值有:

//1.Opaque:絕大部分的不透明物體渲染時(shí)使用

//2.Transparent:絕大部分的透明物體渲染時(shí)使用

//3.BackGround:天空盒

//4.Overlay:用來渲染疊加效果,鏡頭光暈等

Tags{"RendererType"="Opaque"}

//LOD是LevelofDetail的縮寫,我們能用什么樣的shader由它來決定,如果我們在Unity的QualitySetting中設(shè)定最大LOD值小于subshader所指定的值時(shí),則subshader不可使用

//Unity的Shader制定了一組LOD值,我們在寫shader的時(shí)候作為參考,方便以后對設(shè)備圖形性能調(diào)整,和畫質(zhì)有更精確的控制

//Vertexlitkindofshaders(頂點(diǎn)光照類型的shader)=100

//Diffuse(漫反射)=200

//ReflectiveBumpedUnlit(凸起反射不發(fā)光)=250

//ReflectiveBumpedVertexlit(頂點(diǎn)反射不發(fā)光)=250

//Bumped,Specular(凸起,高光)=300

//凹凸高光=400

//Parallax(視差)=500

//ParallaxSpecular(視差高光)=600

LOD200

//表面著色器的實(shí)現(xiàn)代碼必須放在CGPROGRAM...ENDCG代碼塊中,而不是放在pass里邊

//CG(NVIDIA公司開發(fā)的cforgraphic計(jì)算機(jī)圖形編程C語言封裝)

//CG程序可以根據(jù)運(yùn)行時(shí)的需要或者事先編譯成GPU匯編代碼

CGPROGRAM

//這是一條編譯指令,它聲明了我們要寫一個(gè)表面著色器,并且制定了光照模型,語法如下

//#pragrmsurfacesurfaceFunctionlightModel[optionparams]

//surface:聲明一個(gè)表面著色器

//surfaceFunction:著色器方法的名字

//lightModel:使用光照的模型

//optionparams:可選參數(shù),包括透明度,頂點(diǎn)與顏色,投影等等

#pragmasurfacesurfStandardfullforwardshadows

//使用shader3.0版本可以得到更好的光照效果

#pragmatarget3.0

//sampler2D是GPU中2D貼圖的類型,還有sampler3D,samplerCUBE等

//所實(shí)例化的shader是由兩個(gè)獨(dú)立的塊組成,屬性聲明和回調(diào)都是unity,可以直接使用和編譯的shader

//在CG代碼塊中,想要訪問在properties中所定義的變量的話,必須聲明和屬性變量名相同的名字進(jìn)行使用

//sampler2DMainTex其實(shí)就是關(guān)聯(lián)了屬性_MainTex,之后CG程序就可以使用它了

sampler2D_MainTex;

//結(jié)構(gòu)體,float2和vector2一樣,里面存放了兩個(gè)float類型的屬性,可以使用變量名.x的方式獲得某個(gè)值

//在CG程序中制定一個(gè)貼圖變量前加uv字樣,就代表提取它的uv值(其實(shí)就是兩個(gè)代表貼圖上的二維坐標(biāo)點(diǎn))所需要參與計(jì)算的數(shù)據(jù)

structInput?{

//輸入結(jié)構(gòu)體重一般包含著色器所需要的紋理坐標(biāo),命名規(guī)范:uv+紋理名稱

//當(dāng)使用第二紋理,命名為:uv2+紋理名稱

//輸入結(jié)構(gòu)體中還有其他成員變量

//float3viewDir:視角方向

//float4COLOR:每個(gè)頂點(diǎn)的顏色差值

//float4screenPos:屏幕坐標(biāo)(使用.xy/.wh來獲取屏幕2D坐標(biāo))

//float3worldRefl:世界坐標(biāo)系中反射向量

//float3worldNormal:世界坐標(biāo)系中法線向量

float2uv_MainTex;

};

half_Glossiness;

half_Metallic;

fixed4_Color;

//CG規(guī)定了表面著色器代碼方法的參數(shù)類型和名字

//語法結(jié)構(gòu)

//voidsurf(InputIN,inoutSurfaceOutputStandardo)

//其作用是結(jié)構(gòu)輸入的uv或者附加數(shù)據(jù),然后進(jìn)行處理,最后將結(jié)構(gòu)填充到輸出結(jié)構(gòu)體中,所以只能按照規(guī)定來寫

//參數(shù)1:Input:是我們需要定義的輸入結(jié)構(gòu)體,可以吧所需要參與計(jì)算的數(shù)據(jù)放到這個(gè)結(jié)構(gòu)體中,傳入方法使用

//參數(shù)2:inout:SurfaceOutput定義輸出結(jié)構(gòu)體的類型,需要把方法里面得到的結(jié)果賦值給該結(jié)構(gòu)體里面的成員變量即可完成著色

//SurfaceOutput的輸出結(jié)果結(jié)構(gòu)定義如下:

//half3Albedo:像素的顏色

//half3Normal:法線

//half3Emission:自發(fā)光,不受光照影響

//halfSpecular:高光指數(shù)

//halfGloss:光澤度

//halfAlpha:透明度

//SurfaceOutPutStandard輸出結(jié)果定義如下:

//fixed3Albedo:基礎(chǔ)顏色

//fixed3Normal:切線空間法線

//halfSmoothness:是否光滑,0=粗糙,1=光滑

//halfMetallic:是否有金屬光澤,0=非金屬,1=金屬

//halfOcclusion:遮擋(默認(rèn)為1)

//fixedAlpha:透明度

voidsurf?(Input?IN,inoutSurfaceOutputStandard?o)?{

//Albedocomesfromatexturetintedbycolor

//tex2D方法是CG程序中用來在一張貼圖中對一個(gè)點(diǎn)進(jìn)行采樣的方法

//返回一個(gè)fixed4類型

//這里是對_MainTex在輸入點(diǎn)上進(jìn)行采樣

fixed4c?=tex2D(_MainTex,?IN.uv_MainTex)?*?_Color;

//把采樣的顏色賦值給輸出的顏色

o.Albedo?=?c.rgb;

//Metallicandsmoothnesscomefromslidervariable

//金屬

o.Metallic?=?_Metallic;

//光滑

o.Smoothness?=?_Glossiness;

//透明度

o.Alpha?=?c.a;

}

ENDCG

}

FallBack"Diffuse"

}

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

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

  • <轉(zhuǎn)>我也忘了轉(zhuǎn)自哪里,抱歉,感謝原作者 什么是Shader Shader(著色器)是一段能夠針對3D對象進(jìn)行操作...
    星易乾川閱讀 5,848評論 1 16
  • 動(dòng)機(jī)自己使用Unity3D也有一段時(shí)間了,但是很多時(shí)候是流于表面,更多地是把這個(gè)引擎簡單地用作腳本控制,而對更深入...
    JumboWu閱讀 2,215評論 0 24
  • 寫與燈光交互的Shader是很復(fù)雜的,因?yàn)橛胁煌臒艄忸愋?light Type),不同的陰影選項(xiàng)(Shadow ...
    Unity云中客閱讀 6,964評論 0 4
  • 發(fā)現(xiàn)自己還是不會造型,不知道怎么畫。 不知道臨摹多久,才能算真正的會畫畫了。 優(yōu)點(diǎn)是,我也敢于下筆呀。 就是細(xì)致刻...
    FWF閱讀 281評論 0 0
  • 復(fù)習(xí)在經(jīng)過舍和斷之后,每一樣?xùn)|西都是自己喜歡的,這時(shí)候請用三分法整理收納 如何收拾房間里的東西 1選一首自己喜歡聽...
    faithalex閱讀 359評論 0 0

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