招聘 負(fù)責(zé)網(wǎng)站開發(fā)網(wǎng)絡(luò)營銷有什么方式
目錄
一、如何使用屬性
例子
ShaderLab中的屬性的類型和Cg中的變量的類型之間的匹配關(guān)系
二、Unity提供的內(nèi)置文件和變量
內(nèi)置的包含文件
內(nèi)置的變量
一、如何使用屬性
在一開始我們提到過,材質(zhì)和UnityShader之間有著密切的練習(xí),我們可以通過材質(zhì)面板調(diào)節(jié)屬性來達(dá)到我們需要的效果,而這些屬性就需要寫在Properties語義塊中。
例子
在上一節(jié)的例子基礎(chǔ)上,現(xiàn)在我們有這樣一個(gè)需求,需要在材質(zhì)面板中顯示一個(gè)顏色拾取器來調(diào)節(jié)模型在屏幕上顯示的顏色,我們修改上一節(jié)的代買如下:
Shader "Unity Shaders Book/Simple Shader"{Properties{//聲明一個(gè)Color類型的屬性_Color("Color Tint",Color)=(1.0,1.0,1.0,1.0)}SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag//在Cg代碼中我們需要定義一個(gè)與屬性名稱和類型都匹配的變量fixed4 _Color;//使用一個(gè)結(jié)構(gòu)體來定義頂點(diǎn)著色器的輸入struct a2v {//POSITION語義告訴Unity用模型空間的頂點(diǎn)坐標(biāo)填充vertex變量float4 vertex:POSITION;//NORMAL語義告訴Unity用模型空間的法線方向填充normal變量float3 normal:NORMAL;//TEXCOORF0語義告訴Unity用模型的第一套紋理坐標(biāo)填充texcoord變量float4 texcoord:TEXCOORD0;};//使用一個(gè)結(jié)構(gòu)體來定義頂點(diǎn)著色器的輸入struct v2f{//SV_POSITION語義告訴Unity,pos里包含了頂點(diǎn)在裁剪空間中的位置信息float4 pos:SV_POSITION;//COLOR0語義可以用于存儲(chǔ)顏色信息fixed3 color:COLOR0;};v2f vert(a2v v){//聲明輸出結(jié)構(gòu)v2f o;o.pos=UnityObjectToClipPos(v.vertex);//v.normal包含了頂點(diǎn)的法線方向,其分量范圍在【-1.0,1.0】//下面的代碼把分量范圍映射到了[0.0,1.0]//存儲(chǔ)到o.color中傳遞給片元著色器o.color=v.normal*0.5+fixed3(0.5,0.5,0.5);return o;}float4 frag(v2f i):SV_Target{fixed3 c=i.color;//使用_Color屬性來控制輸出顏色c*=_Color.rgb;return fixed4(c,1.0);}ENDCG}}}
效果:
代碼解釋:
在上面的代碼中,我們先添加了Properties語義塊,在里面聲明了一個(gè)屬性_Color,它的類型是Color類型,默認(rèn)值是(1.0,1.0,1.0,1.0),即為白色。為了在Cg代碼中訪問它,我們還需要在Cg代碼片段中提前定義一個(gè)新的變量,這個(gè)變量的名稱和類型必須與Properties語義塊中的屬性定義相匹配。
ShaderLab中的屬性的類型和Cg中的變量的類型之間的匹配關(guān)系
ShaderLab屬性類型 | Cg變量類型 |
Color,Vector | float4,half4,fixed4 |
Range,Float | float,half,fixed |
2D | sampler2D |
Cube | samplerCube |
3D | sampler3D |
有時(shí)候Cg變量前面會(huì)有一個(gè)uniform關(guān)鍵字,如:
uniform fixed4 _Color;
uniform關(guān)鍵字是Cg中修飾變量和參數(shù)的一種修飾詞,它僅僅用于提供一些關(guān)于該變量的初始值是如何指定和存儲(chǔ)相關(guān)信息,在UnityShader中它可以省略。
二、Unity提供的內(nèi)置文件和變量
頂點(diǎn)/片元著色的復(fù)雜之處在于很多事情需要我們自己動(dòng)手,例如我們需要自己轉(zhuǎn)換法線方向,自己處理光照、陰影等,為了便利開發(fā),Unity內(nèi)置了很多文件,這些文件包含了很多提前定義好的變量、函數(shù)和宏等。
內(nèi)置的包含文件
包含文件(include file),這是類似于C++中頭文件的一種文件。在Unity中,它們的后綴是.cginc。在編寫Shader時(shí),我們可以使用#include指令把這些文件包含進(jìn)來,這樣就可以使用Unity為我們提供的一些非常有用的變量和幫助函數(shù)。
如:
CGPROGRAM
//...
#include "UnityCG.cginc"
//...
ENDCG
內(nèi)置的變量
之前在坐標(biāo)變換中給出的一些內(nèi)置變量(點(diǎn)擊查看),同樣也有一些攝像機(jī)參數(shù)的內(nèi)置變量,后續(xù)遇到時(shí)會(huì)進(jìn)行講解。