Unity3D游戲開發(fā)標準教程第05章-著色器編課件_第1頁
Unity3D游戲開發(fā)標準教程第05章-著色器編課件_第2頁
Unity3D游戲開發(fā)標準教程第05章-著色器編課件_第3頁
Unity3D游戲開發(fā)標準教程第05章-著色器編課件_第4頁
Unity3D游戲開發(fā)標準教程第05章-著色器編課件_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第1頁第五章著色器編程基礎(chǔ)

第2頁5.1初識著色器

5.1.1著色器概述著色器是一款運行在GPU上用來實現(xiàn)圖像渲染的程序。目前有三種高級圖像語言可供選擇:HLSL語言、Cg語言和GLSL語言。第3頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)Unity中的著色器程序使用的是ShaderLab著色語言。1.ShaderShader是一個著色器程序的根命令,每個著色器程序都必須唯一定義一個Shader,其中定義了對象材質(zhì)和如何使用這個著色器渲染對象。Shader命令的語法為:1 Shader"name"{[Properties]Subshaders{...}[Fallback]}第4頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)2.Properties著色器程序中一個用來定義著色器屬性的列表:Properties的基本語法為:1 Properties{Property[Property...]}第5頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)2.Properties類型

說明name("displayname",Range(min,max))=num定義浮點數(shù)范圍屬性,在屬性查看器中可通過一個標注了最大值和最小值的滑動條來修改name("displayname",Float)=num定義浮點數(shù)屬性name("displayname",Int)=num定義整型屬性name("displayname",Color)=(num,num,num,num)定義顏色屬性,num取值范圍0~1name("displayname",Vector)=(num,num,num,num)定義四維向量屬性name("displayname",2D)="name"{options}定義2D紋理屬性,缺省值為:"white"、"black"、"gray"、"bump"name("displayname",Rect)="name"{options}定義矩形紋理(尺寸非2次方)屬性,缺省值同2D紋理屬性name("displayname",Cube)="name"{options}定義立方貼圖紋理屬性,缺省值同2D紋理屬性相同name("displayname",3D)="name"{options}定義3D紋理屬性第6頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)2.Properties著色器程序的屬性列表通過“name”來索引其中的屬性,通常方法是下劃線加一個屬性的名字,并且屬性值也要通過“name”來訪問:第7頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)2.Properties包含在紋理屬性的大括號中的options(選項)是可選的:TexGen紋理生成模式,紋理自動生成紋理坐標時的模式??梢允荗bjectLinear、EyeLinear、SphereMap、CubeReflect或CubeNormal,這些模式和OpenGL紋理生成模式相對應(yīng)。注意如果使用自定義頂點片元著色器,那么紋理生成將被忽略LightmapMod光照貼圖模式,如果給出這個選項,紋理會被渲染器的光線貼圖所影響,即紋理不能被應(yīng)用在材質(zhì)中,而是使用渲染器中的設(shè)定第8頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)2.Properties下面的將通過一段最簡單的代碼片段來說明上述Properties的定義方法:1 Properties{2 _RangeValue("RangeValue",Range(0.1,0.5))=0.5//定義一個浮點數(shù)范圍屬性

3 _FloatValue("FloatValue",Float)=1.5//定義一個浮點數(shù)屬性4 _Color("Color",Color)=(1,1,1,1) //定義一個顏色屬性5 _Vector("Vector",Vector)=(1,1,1,1) //定義一個四維向量屬性6 _MainTex("Albedo(RGB)",2D)="white"{TexGenEyeLinear} //定義2D紋理屬性7 _Rect("RectTex",Rect)="black"{TexGenEyeLinear} //定義矩形紋理屬性8 _Cube("CubeTex",Cube)="skybox"{TexGenCubeReflect}//定義立方貼圖紋理屬性9 }第9頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)3.Subshader著色器程序還包含一個子著色器列表,即Subshaders。子著色器列表是真正用來呈現(xiàn)渲染物體的部分。子著色器列表中有且至少有一個子著色器,即Subshader。當(dāng)加載一個著色器程序時,Unity將遍歷該列表來獲取第一個能被用戶機器支持的子著色器。Subshader的基本語法為:1 Subshader{[Tags][CommonState]Passdef[Passdef...]}說明:子著色器由可選標簽(Tags)、通用狀態(tài)(CommonState)和一個同道(Pass)列表構(gòu)成。其中通道列表能夠選擇是否為所有通道初始化所需要的通用狀態(tài)。第10頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)3.Subshader下面的代碼片段是一個簡單的子著色器:1 SubShader{2 Tags{"Queue"="Transparent"} //渲染隊列為透明隊列3 Pass{4 LightingOff //關(guān)閉光照5 SetTexture[_MainTex]{} //設(shè)置紋理6 }}第11頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)4.SubshaderTags子著色器使用標簽來告訴渲染引擎何時渲染以及如何渲染對象,這個標簽就是SubshaderTags。Tags的基本語法為: Tags{"TagName1"="Value1""TagName2"="Value2"}常用的標簽有三種類型,如下所列。(1)隊列標簽(Queuetag):隊列標簽的使用如下。 Tags{"Queue"="Transparent"} //設(shè)置渲染隊列為“透明”第12頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)4.SubshaderTags(2)自定義隊列標簽:Tags的基本語法為:通過著色器可以自定義一個隊列,例如下面的代碼: Tag{"Queue"="Geometry+600"} //自定義渲染隊列(3)渲染類型標簽(RenderTypetag):渲染類型標簽將著色器分為若干個預(yù)定義組。第13頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)4.SubshaderTags渲染類型標簽的預(yù)定義值如表5-3所列隊列名稱說明隊列名稱說明Opaque不透明,用于大多數(shù)著色器(法線著色器、自發(fā)光著色器、反射著色器以及地形著色器)Transparent透明,用于大多數(shù)半透明著色器(透明著色器、粒子著色器、字體著色器、地形額外通道著色器)Background天空盒著色器OverlayGUITexture、光暈著色器、閃光著色器TreeOpaque地形引擎樹皮著色器TreeTransparentCutout地形引擎樹葉TreeBillboard地形引擎布告板樹Grass地形引擎草GrassBillboard地形引擎布告板草TransparentCutout遮蔽的透明著色器(透明鏤空著色器、兩個通道植被著色器)第14頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)5.PassPass是著色器中的通道,用來控制被渲染的對象的幾何體。SubShader中可以包括一個或多個Pass塊,并且每個Pass都能使幾何對象被渲染一次。Pass的基本語法為: Pass{[NameandTags][RenderSetup][TextureSetup]}基本的通道命令由一個定義的名字和任意多的標簽(Tags)、一個可選的渲染設(shè)置命令(RenderSetup)的列表和可選的紋理設(shè)置命令(TextureSetup)的列表三部分構(gòu)成。Pass塊的Name一般用來引用此Pass,并且命名時必須使用大寫第15頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)5.Pass在著色器中通過UsePass重用其他著色器中已存在的通道,提高了代碼的重用率。為了讓UsePass能正常工作,必須將期望被使用的通道命名,通道的命名用“Name”命令。下面將通過一個代碼片段對此進行說明:1 UsePass"Specular/BASE“ //插入鏡面高光著色器中名為“BASE”的通道2 Name“MyPassName“ //通道命名為MyPassNameGrabPass中同樣可以使用Name和Tags命令。將GrabPass放入SubShader中有兩種方式:GrabPass{}:GrabPass{"紋理名"}:第16頁5.1初識著色器

5.1.2ShaderLab語法基礎(chǔ)6.Fallback降級,即Fallback操作定義在所有子著色器后。它的功能是當(dāng)系統(tǒng)沒有采用著色器列表中的任何一個著色器的時候,便會采用降級著色器。從某種意義上來說,降級也是一種子著色器。Fallback的有兩種常見的語法:1 Fallback"name"說明:“name”為指定的著色器名稱,此方法將退回到以該名稱命名的著色器。2 FallbackOff說明:此方法運行后不會進行降級操作且不會得到任何回應(yīng),包括不會打印任何警告,甚至沒有子著色器會被當(dāng)前硬件運行。第17頁5.2表面著色器5.2.1著色器的三種形態(tài)固定管線著色器(fixedfunctionshader):頂點片元程序著色器(vertexandfragmentshader):表面著色器(surfaceshader):

第18頁5.2表面著色器5.2.2表面著色器基礎(chǔ)知識表面著色器需要放置于CGPROGRAM....ENDCG塊中,并且必須將其放置于子著色器塊中,而不能放在通道中,表面著色器自身會編譯為多個通道。1編譯指令表面著色器的編譯指令為#pragmasurface#pragmasurface<surfaceFunction><lightModel>[optionalparams]surfaceFunction:表面著色器函數(shù)名稱lightModel:光照模型optionalparams:可選參數(shù):可用的可選參數(shù)見課本第19頁5.2表面著色器5.2.2表面著色器基礎(chǔ)知識2輸入輸出參數(shù)結(jié)構(gòu)體表面著色器函數(shù)中有兩個參數(shù),分別為Input結(jié)構(gòu)體和SurfaceOutput結(jié)構(gòu)。Input結(jié)構(gòu)體用于向表面著色器函數(shù)中輸入所需的紋理坐標和其它的數(shù)據(jù)。SurfaceOutput結(jié)構(gòu)體用于輸出數(shù)據(jù)Input結(jié)構(gòu)體中的紋理坐標的命名格式為“uv”后接紋理名字,如果物體帶有第二個紋理坐標,則帶有“uv2”的紋理坐標為物體所帶的第二紋理坐標表面著色器的輸出結(jié)構(gòu)體SurfaceOutput是內(nèi)置定義好的,只需在表面著色器函數(shù)中為需要的變量賦值即可,標準的表面著色器輸出結(jié)構(gòu)體如下。第20頁5.2表面著色器5.2.2表面著色器基礎(chǔ)知識2輸入輸出參數(shù)結(jié)構(gòu)體1 structSurfaceOutput{2 half3Albedo;//漫反射的顏色值3 half3Normal; //法線坐標4 half3Emission; //自發(fā)光顏色5 halfSpecular; //鏡面反射系數(shù)6 halfGloss; //光澤系數(shù)7 halfAlpha; //透明度系數(shù)8 };第21頁5.2表面著色器5.2.2表面著色器基礎(chǔ)知識3自定義光照模型自定義光照模型的聲明形式有三種half4Lighting<Name>(SurfaceOutputs,half3lightDir,halfatten)說明:此種聲明在正向渲染路徑中用于非與視線方向相關(guān)的光照模型(例如,漫反射),并且并不取決于視圖的方向。half4Lighting<Name>(SurfaceOutputs,half3lightDir,half3viewDir,halfatten)說明:此種聲明在正向渲染路徑中用于與視線方向相關(guān)的光照模型,并且取決于視圖的方向。half4Lighting<Name>_PrePass(SurfaceOutputs,half4light):說明:此種聲明用于延時光照路徑中的光照模型。第22頁5.2表面著色器5.2.2表面著色器基礎(chǔ)知識光照模型函數(shù)的返回值為經(jīng)過光照計算的顏色值。下面通過一個帶自定義光照模型的表面著色器的案例來詳細介紹自定義光照模型。(1)創(chuàng)建Cube對象。點擊GameObject→3DObject→Cube,創(chuàng)建一個Cube對象。(2)創(chuàng)建Shader腳本。在Assets面板中右鍵點擊Create→Shader,創(chuàng)建一個著色器腳本,并命名為“BNUSurfShader”。然后雙擊文件在腳本編輯器中編輯腳本,具體的代碼見課本。第23頁5.2表面著色器5.2.2表面著色器基礎(chǔ)知識(3)創(chuàng)建Material材質(zhì)球。在Assets面板中右鍵點擊Create→Material,并命名為“SurfMaterial”,再將剛剛編寫好的“BNUSurfShader”腳本掛載到材質(zhì)球上。然后將材質(zhì)球拖拽到Cube的屬性面板中。點擊材質(zhì)球,為材質(zhì)球選擇“Texture.jpg”貼圖,材質(zhì)球?qū)傩匀鐖D5-2所示。圖5-2材質(zhì)球?qū)傩缘?4頁5.2表面著色器5.2.2表面著色器基礎(chǔ)知識(4)運行項目。單擊游戲運行按鈕運行該案例,在項目效果查看界面可以看到通過調(diào)整材質(zhì)球?qū)傩悦姘宓膮?shù),Cube對象的光照會發(fā)生變化,如圖5-3和圖5-4。圖5-3自定義光照效果1圖5-4自定義光照效果2第25頁5.2表面著色器5.2.2表面著色器基礎(chǔ)知識4頂點變換函數(shù)1 void<Name>(inoutappdata_fullv)說明:此函數(shù)用于只修改頂點著色器中的輸入頂點數(shù)據(jù)。half4<Name>(inoutappdata_fullv,outInputo)說明:此函數(shù)用于修改頂點著色器中的輸入頂點數(shù)據(jù)以及為表面著色器函數(shù)傳遞數(shù)據(jù)。其中inout類型的結(jié)構(gòu)體使用了頂點數(shù)據(jù)結(jié)構(gòu)體,用于給頂點函數(shù)輸入頂點數(shù)據(jù)。out類型的結(jié)構(gòu)體為表面著色器中使用的輸入結(jié)構(gòu)體,用于頂點變換函數(shù)為表面著色器函數(shù)傳遞數(shù)據(jù)。第26頁5.2表面著色器5.2.2表面著色器基礎(chǔ)知識吹氣膨脹效果的表面著色器案例(1)導(dǎo)入模型對象。將目標模型對象導(dǎo)入工程文件夾中(2)創(chuàng)建Shader腳本,詳見課本(3)運行項目。將剛剛編寫好的BNUVertex.shader著色器拖拽到導(dǎo)入的模型對象的材質(zhì)球上(本案例中為panda模型的下Object04.obj對象),單擊游戲運行按鈕運行該案例,在項目效果查看界面可以看到經(jīng)過頂點變換函數(shù)膨脹處理過的模型對象會充氣膨脹,如圖5-5和圖5-6所示。第27頁5.2表面著色器5.2.2表面著色器基礎(chǔ)知識吹氣膨脹效果的表面著色器案例

圖5-5膨脹處理前效果 圖5-6膨脹處理后效果第28頁5.3渲染通道的通用指令固定管線著色器、頂點片元著色器以及表面著色器都可以通過一些指令來控制渲染通道。這些通用指令可以用來實現(xiàn)一些游戲中常用的特效,例如半透明效果、鏡面及倒影等等。下面將詳細介紹一些基本的通用指令。5.3.1設(shè)置LOD數(shù)值內(nèi)置著色器的LOD分級如下VertexLitkindofshaders100Decal、ReflectiveVertexLit150Diffuse200DifuseDetail、ReflectiveBumpedUnlit、ReflectiveBumpedVertexLit250Bumped、Specular300BumpedSpecular400Parallax500ParallaxSpecular600第29頁5.3渲染通道的通用指令控制LOD數(shù)值來改變模型對象的顏色的著色器案例(1)導(dǎo)入模型對象(2)創(chuàng)建Shader腳本:在Assets面板中右鍵點擊Create→Shader,創(chuàng)建一個著色器腳本,并命名為“BNULOD”,然后雙擊文件在腳本編輯器中編輯腳本,具體的代碼見課本。(3)創(chuàng)建Material材質(zhì)球。在Assets面板中右鍵點擊Create→Material,并命名為“LODMaterial”,再將剛剛編寫好的“BNULOD”腳本拖拽到材質(zhì)球“LODMaterial”上,最后將材質(zhì)球拖拽到模型對象的屬性面板中(4)編寫控制最大LOD數(shù)值的C#腳本。在Assets面板中右鍵點擊Create→C#,創(chuàng)建一個C#腳本,命名為“SetLOD.cs”,然后雙擊在腳本編輯器中編輯腳本,具體的代碼見課本。(5)將創(chuàng)建的“SetLOD.cs”腳本拖拽到主攝像機上,然后將“BNULOD”著色器拖拽到主攝像機的“SetLOD.cs”腳本組件的myShader屬性欄中。第30頁5.3渲染通道的通用指令控制LOD數(shù)值來改變模型對象的顏色的著色器案例運行項目。單擊游戲運行按鈕運行該案例,從右到左依次調(diào)節(jié)LOD數(shù)值為600,500,400,300,觀察大白的顏色會發(fā)生變化,在項目效果查看界面可以看到不同的顏色,如圖5-7所示。

圖5-7LOD值不同時大白顏色不同第31頁5.3渲染通道的通用指令5.3.2渲染隊列渲染隊列數(shù)值可以決定Unity在渲染場景物體時的先后順序,其原理是Unity在關(guān)閉深度檢測的情況下渲染物體時后渲染的物體總是遮擋住先渲染的物體Unity中內(nèi)置了5種默認的渲染隊列的值Background:背景,對應(yīng)值為1000,這個渲染隊列在所有隊列之前被渲染,通常用于渲染真正需要放在背景上的物體,比如:天空盒Geometry:幾何體(默認值),對應(yīng)值為2000,這個隊列是默認的渲染隊列,被用于大多數(shù)對象。不透明的幾何體使用這個隊列AlphaTest:Alpha測試,對應(yīng)值為2450,alpha測試的幾何結(jié)構(gòu)使用這種隊列。它是一個獨立于Geometry的隊列,因為它可以在所有固體對象繪制后更有效地渲染采用alpha測試的對象Transparent:透明,對應(yīng)值為3000,這個渲染隊列在Geometry隊列之后被渲染,采用從后到前的次序。任何采用alpha混合的對象(不對深度緩沖產(chǎn)生寫操作的著色器)在這里渲染,比如:玻璃、粒子效果Overlay:覆蓋,對應(yīng)值為4000,這個渲染隊列被用于實現(xiàn)疊加效果。任何需要最后渲染的對象應(yīng)該放置在此處,比如:鏡頭光暈第32頁5.3渲染通道的通用指令5.3.2渲染隊列下面通過一個更改兩個小球渲染次序的案例來詳細介紹渲染隊列。(1)創(chuàng)建小球?qū)ο?。點擊GameObject→3DObject→Sphere,創(chuàng)建兩個Sphere對象,并分別命名為“Ball1”和“Ball2”,并調(diào)節(jié)兩個小球的位置,將“Ball1”放在“Ball2”前方,保證攝像機視角中“Ball1”遮住“Ball2”。(2)創(chuàng)建Shader腳本。在Assets面板中右鍵點擊Create→Shader,創(chuàng)建兩個著色器腳本,并分別命名為“BNURender100”和“BNURender200”。然后雙擊文件在腳本編輯器中編輯腳本,“BNURender100”具體的代碼實現(xiàn)如下1 Shader"Custom/BNURender100"{2 Properties{3 _Color("MainColor",Color)=(0,0,0,0) //主顏色數(shù)值4 }5 SubShader{6 Tags{"Queue"="Geometry+100"} //設(shè)置渲染隊列數(shù)值7 ZTestoff //關(guān)閉深度檢測第33頁5.3渲染通道的通用指令5.3.2渲染隊列8 CGPROGRAM9 #pragmasurfacesurfLambert //表面著色器編譯指令10 fixed4_Color; //主顏色屬性11 structInput{ //Input結(jié)構(gòu)體12 float2uv_MainTex;13 };14 voidsurf(InputIN,inoutSurfaceOutputo){ //表面著色器函數(shù)15 o.Albedo=_Color; //設(shè)置物體表面顏色16 }17 ENDCG18 }}第34頁5.3渲染通道的通用指令5.3.2渲染隊列下面通過一個更改兩個小球渲染次序的案例來詳細介紹渲染隊列。(3)然后再編寫另一個著色器腳本,該腳本除了渲染隊列數(shù)值設(shè)置為“Geometry+200”,其他代碼和“RenderQueue100”著色器基本相同。(4)創(chuàng)建Material材質(zhì)球。在Assets面板中右鍵點擊Create→Material,并分別命名為“RenderQueue100”和“RenderQueue200”,再將剛剛編寫好的“BNURender100”和“BNURender200”腳本分別拖拽到這兩個材質(zhì)球上,然后將材質(zhì)球拖拽到兩個小球?qū)ο蟮膶傩悦姘逯小#?)單擊游戲運行按鈕,觀察效果。發(fā)現(xiàn)雖然“Ball1”在“Ball2”的前面,

但是“Ball1”無法遮擋住“Ball2”,如圖5-8所示。這是因為

“Ball2”材質(zhì)的渲染隊列數(shù)值比“Ball1”的大,所以后渲染的

“Ball2”小球遮擋住先渲染的“Ball1”小球。第35頁5.3渲染通道的通用指令5.3.2渲染隊列圖5-8渲染隊列案例演示第36頁5.3渲染通道的通用指令5.3.3Alpha測試最后一次能夠決定讓片元顯示或者不顯示的修改AlphaTest開關(guān)狀態(tài)開關(guān)狀態(tài)為Off時關(guān)閉Alpha測試繪制所有片元,開關(guān)狀態(tài)為On時開啟Alpha測試,默認情況下為Off,關(guān)閉Alpha測試。AlphaTest比較模式[測試值]設(shè)置Alpha測試只渲染透明度值在某一確定范圍內(nèi)的片元。常用的比較模式如下Greater大于Less小于Equal等于Always渲染所有片元,等于AlphaTestOffGequal大于等于Lequal小于等于NotEqual不等于Never不渲染任何片元第37頁5.3渲染通道的通用指令5.3.3Alpha測試一個通過Alpha測試來控制面顯示區(qū)域的案例(1)創(chuàng)建面對象。點擊GameObject→3DObject→Plane,創(chuàng)建一個Plane對象,并調(diào)節(jié)Plane的角度,使其正面正對攝像機。(2)創(chuàng)建Shader腳本。在Assets面板中右鍵點擊Create→Shader,創(chuàng)建一個著色器腳本,并命名為“BNUAlphaT”。然后雙擊文件在腳本編輯器中編輯腳本,具體的代碼見課本。(3)創(chuàng)建Material材質(zhì)球。在Assets面板中右鍵點擊Create→Material,并命名為“AlphaTMaterial”,再將剛剛編寫好的“BNUAlphaT”腳本拖拽到材質(zhì)球上。(4)添加紋理圖。將半透明漸變紋理圖拖拽到材質(zhì)球的Texture屬性上,

漸變紋理圖的Alpha值從左到右依次遞減,如圖5-9所示。

圖中灰白相間的格子區(qū)域表示透明區(qū)域,格子越清楚Alpha值越小。(5)單擊游戲運行按鈕,在材質(zhì)球的屬性界面中調(diào)整材質(zhì)球Alpha值發(fā)現(xiàn)Plane能顯示出來的黑色區(qū)域會增大或減小,如圖5-10所示。第38頁5.3渲染通道的通用指令5.3.3Alpha測試一個通過Alpha測試來控制面顯示區(qū)域的案例

圖5-9“Mesh”紋理圖圖5-10 Alpha測試效果圖第39頁5.3渲染通道的通用指令5.3.4深度測試深度測試能夠保證距離攝像機近的物體遮擋住距離攝像機遠的物體,這樣才能符合真實世界的物理規(guī)律。當(dāng)片元寫入到幀緩沖前,需要將待寫入的片元的深度值Z與深度緩沖區(qū)對應(yīng)的深度值進行比較測試,只有測試成功才會寫入幀緩沖。深度測試指令如下。ZWrite深度寫開關(guān)控制是否將來自對象的片元深度值Z寫入深度緩沖,此測試默認開啟。如果繪制不透明物體,設(shè)置為On;繪制半透明物體時設(shè)為Off。ZTest深度測試模式設(shè)置深度測試模式執(zhí)行。默認模式是LequalOffsetFactor,Units允許使用兩個參數(shù)(因子(factor)和單元(units))指定深度偏移的量,因子(Factor)衡量多邊形Z軸與X軸或Y軸的最大斜率,而單元(units)衡量可分解的最小深度緩存值。第40頁5.3渲染通道的通用指令5.3.4深度測試控制深度測試模式更改面顯示效果的案例。(1)創(chuàng)建Plane對象。點擊GameObject→3DObject→Plane,創(chuàng)建四個Plane對象,并分別命名為“MainPlane”、“RedPlane”、“BluePlane”和“GreenPlane”,并調(diào)節(jié)四個Plane的位置,使它們兩兩對稱且交叉傾斜,如圖所示。第41頁5.3渲染通道的通用指令5.3.4深度測試控制深度測試模式更改面顯示效果的案例。(2)創(chuàng)建Material材質(zhì)球。在Assets面板中右鍵點擊Create→Material,創(chuàng)建3個材質(zhì)球,并分別命名為“RedMaterial”、“BlueMaterial”和“GreenMaterial”,并將“RedMaterial”材質(zhì)設(shè)為紅色,“BlueMaterial”材質(zhì)設(shè)為藍色,“GreenMaterial”材質(zhì)設(shè)為綠色。最后將三個材質(zhì)球分別設(shè)置為“RedPlane”、“BluePlane”和“GreenPlane”三個Plane對象的材質(zhì)。(3)在Asserts下新建一個文件夾,并命名為“Shader”,在該文件夾下創(chuàng)建七個材質(zhì)資源,分別命名為“Always”、“Equal”、“GEqual”、“Greater”、“LEqual”、“Less”和“NotEqual”。然后再創(chuàng)建七個著色器,名字和七個材質(zhì)資源一一對應(yīng)。(4)將七個著色器分別拖拽到對應(yīng)名字的材質(zhì)的著色器屬性欄中。這七個著色器除了深度測試模式不同外其它部分都相同,而七個著色器的深度測試模式與其名字相同。下面以“LEqual”著色器為例來介紹。第42頁5.3渲染通道的通用指令5.3.4深度測試1 Shader"Custom/BNULEqual"{2 SubShader{3 ZTestLEqual //深度測試4 CGPROGRAM5 #pragmasurfacesurfLambert //表面著色器編譯指令6 structInput{ //Input結(jié)構(gòu)體7 float2uv_MainTex; //UV紋理坐標8 };9 voidsurf(InputIN,inoutSurfaceOutputo){//表面著色器函數(shù)10 o.Albedo=float3(1,1,1); //設(shè)置漫反射顏色為白色11 }12 ENDCG13 }}第43頁5.3渲染通道的通用指令5.3.4深度測試控制深度測試模式更改面顯示效果的案例。(5)創(chuàng)建功能腳本。在Assets文件夾下創(chuàng)建一個腳本,并命名為“BNUZTest.cs”,然后將其拖拽到“MainPlane”對象上,然后雙擊打開該腳本,開始“BNUZTest.cs”腳本的編寫。(6)設(shè)置“MainPlane”對象的“BNUZTest.cs”腳本組件的相應(yīng)參數(shù),具體參數(shù)設(shè)置如圖5-11所示。其中將Mats數(shù)組數(shù)量設(shè)為7后,然后將Shader文件夾下的7個材質(zhì)資源按照名稱分別拖拽到相應(yīng)位置,然后將Labels的Size設(shè)置為7,分別輸入7種深度測試模式的名稱。(7)單擊游戲運行按鈕,觀察效果?!癕ainPlane”對象使用的默認材質(zhì)的深度測試模式為LEqual,距離攝像機近的物體遮擋住距離攝像機遠的物體,場景符合物理規(guī)律,如圖5-13所示。然后拖動滑動條切換深度測試模式,會出現(xiàn)不同的效果,原理都是改變了深度測試模式。

第44頁5.3渲染通道的通用指令5.3.4深度測試控制深度測試模式更改面顯示效果的案例。圖5-11“BNUZTest”腳本組件的參數(shù)設(shè)置

圖5-13案例運行效果

第45頁5.3渲染通道的通用指令5.3.5通道遮罩(1)創(chuàng)建Plane對象。點擊GameObject→3DObject→Plane,創(chuàng)建兩個Plane對象,并命名為“FrontPlane”和“BackPlane”,并調(diào)兩個Plane的位置和大小,使其一前一后出現(xiàn)在攝像機前,并且后面的Plane對象要比前面的大,如圖5-14所示。第46頁5.3渲染通道的通用指令5.3.5通道遮罩(2)創(chuàng)建Material材質(zhì)球。在Assets面板中右鍵點擊Create→Material,創(chuàng)建一個材質(zhì)球,并命名為“FrontMaterial”,然后將其設(shè)置為“FrontPlane”的材質(zhì)。(3)創(chuàng)建Shader腳本。在Assets面板中右鍵點擊Create→Shader,創(chuàng)建一個著色器腳本,并命名為“BNUFront”,將其拖拽到“FrontMateial”材質(zhì)球的屬性面板上。然后雙擊文件在腳本編輯器中編輯腳本,具體的代碼實現(xiàn)如下。第47頁5.3渲染通道的通用指令5.3.5通道遮罩1 Shader"Custom/BNUFront"{2 SubShader{3 Tags{"Queue"="Geometry+2“} //設(shè)置渲染隊列4 Pass{5 Color(1,1,1,1) //設(shè)置物體表面顏色6 }}}說明:此著色器的功能是設(shè)置渲染隊列,使該物體在場景中在最后被渲染,并且渲染為白色。第48頁5.3渲染通道的通用指令5.3.5通道遮罩(4)添加紋理圖。為“BackPlane”添加紋理圖(本案例紋理圖為隨書光盤中第5章目錄下的BNUMask/Assets/texture.jpg)。然后在場景中創(chuàng)建一個小球,設(shè)置小球的位置使小球在“FrontPlane”對象的前面。(5)然后創(chuàng)建一個材質(zhì)球,命名為“ColorMask”。將創(chuàng)建的材質(zhì)資源設(shè)置為小球?qū)ο蟮牟馁|(zhì)。再創(chuàng)建一個著色器命名為“BNUMask”,將創(chuàng)建著色器拖拽到“ColorMask”材質(zhì)的著色器屬性欄中。然后雙擊打開該著色器,開始“BNUMask”著色器的編寫。1 Shader"Custom/BNUMask"{2 SubShader{3 Tags{"Queue"="Geometry+1“} //設(shè)置渲染隊列4 Pass{5 ColorMask0 //設(shè)置通道遮罩模式為06 Color(1,1,1,1) //設(shè)置物體表面顏色7 }}}第49頁5.3渲染通道的通用指令5.3.5通道遮罩(6)單擊游戲運行按鈕,觀察效果。發(fā)現(xiàn)在小球的位置會透過“FrontPlane”對象直接看到“BackPlane”對象,如圖5-15所示。第50頁5.4通過表面著色器實現(xiàn)體積霧1、基本原理首先通過當(dāng)前待處理片元的位置與

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論