日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity3DShader基础(CG)

發布時間:2024/8/1 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity3DShader基础(CG) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Shader分為三種著色器:1.固定管線著色器,2.表面著色器,頂點和片元著色器
1.固定管線著色器:

//固定管線著色器:從語法上將是最簡單的著色器,雖然功能有限 //但是在三種著色器中試運行最快的,在所有硬件設備上都可以運行//組件構成,Properties,SubShader,FallBackShader "CustomLearn/First" {//表示屬性的格式:_Name(“DisplayName”,type)= defaultValue(選項{options})//_Name:是屬性的名字,簡單來說就是變量的名字,在以后的整個shader代碼中使用的這個名字獲取屬性的值//DisplayName:表示要顯示在Unity材質編輯器中作為編輯器Shader的使用者的可讀的內容//Type:屬性的類型:有以下幾種// 1.Color-顏色,有RGBA四個變量開控制,以0~1來取值// 2.2D- 一個2的冪次方大小的貼圖,這張貼圖將在采樣后被轉為對應于基于模型的UV坐標的每個像素的顏色,最終被顯示出來// 3.Rect:一個非2次冪大小的貼圖// 4.Cube:Cube map Texture(立方體紋理),簡單倆說就是使用6張有聯系的2D貼圖的組合,主要用來做發射效果(天空盒子)// 5.Range:一個介于最大值和最小值之間的浮點數,其值可以在材質編輯面板中進行設置,一般用于調節shader某些特定的參數,比如透明度(0~1)// 6.Float:表示任意一個浮點數// 7.Vector:——一個四維數,格式(x,y,z,w)// 8.defaultValue:默認值,表示一個符合類型格式的值Properties{_Color("Main Color",Color) = (1,0.5,0.5,1)_Alpha("Alpha",Range(0,1)) = 0.5}//是子著色器,可以有一個或多個,在實際運行當中選擇哪一個著色器運行是由運行平臺來決定的//子著色器是代碼的主體,每一個著色器中包含一個或者多個Pass,每個pass都會渲染一次對象//在計算著色時,平臺會優先選用著色器,然依次選擇其中的Pass運行,會得到一個輸出的結果最后渲染出來//pass通道:通過控制渲染的對象的一個幾何體,除了表面著色器以外,其他兩種著色器SubShader中多要包含,主要作用就是渲染材質所在的游戲對象//pass語法:{{Name and Tags}[RenderSetUp][TextureSetUp]}//一,Name and Tags:可以定義Pass的名字和任意數量的標簽,為Pass命名后,可以在別的Shader中使用改名字來重用它//二。標簽則可以用來向渲染管線說明Pass的意圖;//三,渲染設置:只用于固定功能管線著色器可以設置圖形硬件的各種狀態,//可用的設置如下://1.Material{}:材質,定義一個頂點光照管線材質//2.Lighting{}:光照,提供選擇有OnOff//3.Cull:裁剪,設置裁剪的模式,有Backfrontoff//4.ZTest:深度測試,模式包括:LessGreaterGEqualEqualNotEqualAlways;//5.ZWrite:深度緩存寫入,取值為OnOff//6.Foq{}:霧效,設置霧效參數//7.AlphaTest:設置Alpha測試,模式:LessGreaterLEqua//8.Blendalpha融合//9.Color:顏色,設置頂點關照關閉時使用的顏色值//10.ColorMask:顏色遮罩,其值為0,關閉所有顏色通道渲染,取值為RGBA或者RGB的任意組合//11.offset:深度偏移//12.SeparateSpecular:高光顏色取值為On,或者OFF//13.ColorMaterial:顏色集,當計算頂點光照時,使用每個頂點的顏色SubShader{Pass{//Material{Diffuse[_Color]}SeparateSpecular OnLighting On //光照 or "off"Cull off //剔除(前,后)orfrontoroff”(什么都不提出)}}FallBack "Diffuse" //默認慢反射,如果上面的GPU都不支持,會默認返回Diffuse(支持所有的平臺)這個Shader }

小測試,寫一個簡單的效果,讓草坪貼圖看起來更真實:
代碼如下:

Shader "CustomLearn/Sceond" {Properties{//主顏色_Color("Main Color",color) = (1,1,1,0.5)//高光_SpecColor("Spec Color",color) = (1,1,1,1)//自發光_Emmision("Emmision",color) = (0,0,0,0)//太陽光_Shiness("Shiness",Range(0.01,1)) =0.7//主紋理_MainTex("MainTexture",2D) = "white"{}}SubShader{//tag表示你輸出的是什么,如果輸出中都是非透明物體,寫在Opaque中,如果想渲染透明的或者半透明的物體,寫在Transparent中//其他的標簽還有:“IqnoreProjector” = “True”(忽略投影,),不被Projector投影所影響//“ForceNoShaderCasting” = “True”(從來不產生陰影)//“Queue” = “XXX”(指定渲染順序隊列)Tags{"Queue" = "Transparent"}//“Queue”中可以使用的值有://BackGroud:是最早被調用的渲染,用來渲染天空或者背景//Geometry:默認值,用來渲染非透明物體//AlphaTest:用來渲染透明度的//Overlay:用來渲染疊加效果是渲染的最后階段//透明的混合Blend srcAlpha OneMinusSrcAlphapass{Material{//漫反射顏色Diffuse[_Color]//環境光顏色Ambient[_Color]Shininess[_Shiness]Specular[_SpecColor]Emission[_Emmision]}//開啟燈光Lighting On//開啟頂點光照的平行高光顏色SeparateSpecular On//設置紋理SetTexture[_MainTex]{//紋理顏色constantcolor[_Color]//混合效果//紋理*原色的兩倍,紋理*常量顏色Combine texture*primary DOUBLE,texture*constant}}}FallBack "Diffuse" }

2,表面著色器

Shader "CustomLearn/Thrid" {Properties {_Color("Color",Color)=(1,1,1,1)//對于貼圖來說,其值可以用一個代表tint顏色的字符串來表示//后面跟option選項,選項值可以為空,這里的option之和貼圖有關,里面至少要有一個為空{},//如果需要加入一些特定的選項,有:ObjectLinear、SphereMap、CubeReflect//圖片的字符串默認值可以為:White,black,gray,bump(凹凸)_MainTex("Albeo (RGB)",2D)="white"{}//表面光滑度_Glossiness("Smoothness",Range(0,1)) = 0.5//表面帶有金屬光澤度_Metallic("Metallic",Range(0,1)) = 0.0}SubShader {//表面著色器可以被若干個標簽所修飾,而硬件將通過判定這些標簽來決定什么時候該用什么著色器//如果"RenderType"="Opaque",表示在渲染非透明的物體時調用,所以透明Transparent(表示有透明效果的物體時調用)//RennderType課賦值的類型有://1. opaque:絕大部分不透明物體使用這個//2. Transparent:絕大部分透明或者半透明物體,粒子特效使用//3.Background:天空盒子使用這個//4.Overlay:用來渲染疊加效果,鏡頭光暈使用這個Tags{"RenderType" = "Opaque"} //渲染不透明的//LOD指的是Level of Detail 的縮寫,我們能夠使用什么樣的Shader實際由它來決定//Unity內的Shader指定了一組LOD值,我們在寫Shader的時候,可以將這些值作為參考//VertexLit(頂點光照):大約是:100//Decal,Reflective VertexLit(反射頂點光照):150//Diffuse:(漫反射):200//Deiffuse Detail:250//Bumped,Spercular(凹凸,高光):300//BumpedSpercular(凹凸高光):400//Parallax(視差):500//Parallax Spercular(視差高光):600LOD 200//表面著色器中的實現代碼需要放在CGPROGRAM……ENDCG中CGPROGRAM//#pragma(唯一標識) surface(使用表面著色器) surf(著色器表面函數的名字,用來處理Shader中的輸入,以及負責輸出) Standard fullforwardshadows//-//LightModel:使用光照的模型,Lambert是普通的diffuse作為光照模型#pragma surface surf Standard fullforwardshadows//使用的Shader版本3.0#pragma target 3.0//表示GLSL中的紋理類型,相應的類型還有sampler1Dmsampler3D,samplerCube等sampler2D _MainTex;//所需要參與計算的數據//輸入解放構體中還可以包括其他成員//float viewDir:視角方向//float COLDR:每個頂點的顏色插值//float4 screenPos:屏幕坐標(使用x,y,z,w)//float3 worldPos:世界坐標struct Input{float2 uv_MainTex;};half _Glossiness;half _Metallic;fixed4 _Color;//表面著色器代碼方法,著色器就是給定了輸出,然后給出輸出盡心著色的代碼//第一個參數:IN是我們需要定義的輸入結構,可以把所需要的參與計算的數據都放在該結構體匯總,出入方法使用//第二個參數:inout SurfaceOutputStandard定義輸出結構的類型,需要把方法中得到的結果賦值給該結構體里面的成員變量即可以完成著色//SurfaceOutputStandard標準結構輸出//half:為半精度浮點數//1.fixed3 Albedo:基礎顏色(漫反射)//2.fixed3 Normal:切線空間法線//2.half Metallic:是否有金屬特性,0=非金屬特性,1=金屬//4.half Smoothness:是否光滑,0=粗糙,1=光滑//5.half Occlision:遮擋//6.fixed Alpha:透明度void surf(Input IN,inout SurfaceOutputStandard o){// tex2D方法是CG程序中用來在一張貼圖上對一個點進行采樣的方法//返回一個fixed4類型的值(fixed取代的一個浮點數)//這里是對輸入的_MainTex進行采樣fixed4 c = tex2D(_MainTex,IN.uv_MainTex)*_Color;//吧采樣后的顏色賦值給輸出顏色o.Albedo = c.rgb;o.Alpha = c.a;o.Metallic= _Metallic;o.Smoothness = _Glossiness;}//表示CG的語法結束ENDCG}FallBack "Diffuse" }

實例測試:一個真實的石頭

//實現法線貼圖的,讓模型的表面實現一些凹凸的細節 Shader "CustomLearn/Forth" {Properties {//紋理屬性_MainTex("Texture",2D) = "white"{}//發現貼圖屬性_BumpMap("Bump",2D) = "bump"{}}SubShader {//表示渲染非透明物體Tags{"RenderType" = "Opaque"}//LOD默認200,可以省略//CG代碼CGPROGRAM#pragma surface surf Lambert//版本可以省略#pragma//輸入的數據結構體struct Input{float2 uv_MainTex;float2 uv_BumpMap;};sampler2D _MainTex;sampler2D _BumpMap;void surf(Input IN,inout SurfaceOutput o){//輸出顏色的處理o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;//在計算發現的時候,只需要調用UnpackNormal這個函數就可以實現//趨近的映射或者說UnpackNormal是對法線紋理的采樣方法,將法線紋理中的顏色映射回正確的法線向量o.Normal = UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap));}ENDCG}FallBack "Diffuse" }

實例測試02:動態云圖

Shader "CustomLearn/Five" {Properties {//紋理_MainTex("Albedo(RGB)",2D) = "white"{}//顏色_Color("Color",color)=(0,0,0,0)//透明度_Alpha("Alpha",Range(0,1)) = 0.5_SpeedX("X_speed",Range(0.5,10)) = 0.6_SpeedY("Y_speed",Range(0.5,10)) = 0.6}SubShader {Tags{"ReaderType" = "Transparent"}CGPROGRAM//alpha表示透明#pragma surface surf Lambert alphasampler2D _MainTex;fixed _Alpha;fixed _SpeedX;fixed _SpeedY;fixed4 _Color;//輸入結構體struct Input{float2 uv_MainTex;};void surf(Input IN,inout SurfaceOutput o){fixed xSpeed = _SpeedX*_Time*0.1;fixed ySpeed = _SpeedY*_Time*0.1;//根據輸入的紋理的uv信息和設置的速度得到要動態重新顯示的紋理上的uvfixed2 uv = IN.uv_MainTex - fixed2(xSpeed,ySpeed);//根據計算出的動態uv進行像素點采樣fixed3 c = tex2D(_MainTex,uv);o.Albedo = c.rgb;o.Alpha = _Alpha;}ENDCG}FallBack "Diffuse" }

總結

以上是生活随笔為你收集整理的Unity3DShader基础(CG)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。