Unity3DShader基础(CG)
生活随笔
收集整理的這篇文章主要介紹了
Unity3DShader基础(CG)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Shader分為三種著色器:1.固定管線著色器,2.表面著色器,頂點(diǎn)和片元著色器
1.固定管線著色器:
小測試,寫一個簡單的效果,讓草坪貼圖看起來更真實(shí):
代碼如下:
2,表面著色器
Shader "CustomLearn/Thrid" {Properties {_Color("Color",Color)=(1,1,1,1)//對于貼圖來說,其值可以用一個代表tint顏色的字符串來表示//后面跟option選項,選項值可以為空,這里的option之和貼圖有關(guān),里面至少要有一個為空{(diào)},//如果需要加入一些特定的選項,有:ObjectLinear、SphereMap、CubeReflect//圖片的字符串默認(rèn)值可以為:White,black,gray,bump(凹凸)_MainTex("Albeo (RGB)",2D)="white"{}//表面光滑度_Glossiness("Smoothness",Range(0,1)) = 0.5//表面帶有金屬光澤度_Metallic("Metallic",Range(0,1)) = 0.0}SubShader {//表面著色器可以被若干個標(biāo)簽所修飾,而硬件將通過判定這些標(biāo)簽來決定什么時候該用什么著色器//如果"RenderType"="Opaque",表示在渲染非透明的物體時調(diào)用,所以透明Transparent(表示有透明效果的物體時調(diào)用)//RennderType課賦值的類型有://1. opaque:絕大部分不透明物體使用這個//2. Transparent:絕大部分透明或者半透明物體,粒子特效使用//3.Background:天空盒子使用這個//4.Overlay:用來渲染疊加效果,鏡頭光暈使用這個Tags{"RenderType" = "Opaque"} //渲染不透明的//LOD指的是Level of Detail 的縮寫,我們能夠使用什么樣的Shader實(shí)際由它來決定//Unity內(nèi)的Shader指定了一組LOD值,我們在寫Shader的時候,可以將這些值作為參考//VertexLit(頂點(diǎn)光照):大約是:100//Decal,Reflective VertexLit(反射頂點(diǎn)光照):150//Diffuse:(漫反射):200//Deiffuse Detail:250//Bumped,Spercular(凹凸,高光):300//BumpedSpercular(凹凸高光):400//Parallax(視差):500//Parallax Spercular(視差高光):600LOD 200//表面著色器中的實(shí)現(xiàn)代碼需要放在CGPROGRAM……ENDCG中CGPROGRAM//#pragma(唯一標(biāo)識) surface(使用表面著色器) surf(著色器表面函數(shù)的名字,用來處理Shader中的輸入,以及負(fù)責(zé)輸出) Standard fullforwardshadows//-//LightModel:使用光照的模型,Lambert是普通的diffuse作為光照模型#pragma surface surf Standard fullforwardshadows//使用的Shader版本3.0#pragma target 3.0//表示GLSL中的紋理類型,相應(yīng)的類型還有sampler1Dmsampler3D,samplerCube等sampler2D _MainTex;//所需要參與計算的數(shù)據(jù)//輸入解放構(gòu)體中還可以包括其他成員//float viewDir:視角方向//float COLDR:每個頂點(diǎn)的顏色插值//float4 screenPos:屏幕坐標(biāo)(使用x,y,z,w)//float3 worldPos:世界坐標(biāo)struct Input{float2 uv_MainTex;};half _Glossiness;half _Metallic;fixed4 _Color;//表面著色器代碼方法,著色器就是給定了輸出,然后給出輸出盡心著色的代碼//第一個參數(shù):IN是我們需要定義的輸入結(jié)構(gòu),可以把所需要的參與計算的數(shù)據(jù)都放在該結(jié)構(gòu)體匯總,出入方法使用//第二個參數(shù):inout SurfaceOutputStandard定義輸出結(jié)構(gòu)的類型,需要把方法中得到的結(jié)果賦值給該結(jié)構(gòu)體里面的成員變量即可以完成著色//SurfaceOutputStandard標(biāo)準(zhǔn)結(jié)構(gòu)輸出//half:為半精度浮點(diǎn)數(shù)//1.fixed3 Albedo:基礎(chǔ)顏色(漫反射)//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程序中用來在一張貼圖上對一個點(diǎn)進(jìn)行采樣的方法//返回一個fixed4類型的值(fixed取代的一個浮點(diǎn)數(shù))//這里是對輸入的_MainTex進(jìn)行采樣fixed4 c = tex2D(_MainTex,IN.uv_MainTex)*_Color;//吧采樣后的顏色賦值給輸出顏色o.Albedo = c.rgb;o.Alpha = c.a;o.Metallic= _Metallic;o.Smoothness = _Glossiness;}//表示CG的語法結(jié)束ENDCG}FallBack "Diffuse" }實(shí)例測試:一個真實(shí)的石頭
//實(shí)現(xiàn)法線貼圖的,讓模型的表面實(shí)現(xiàn)一些凹凸的細(xì)節(jié) Shader "CustomLearn/Forth" {Properties {//紋理屬性_MainTex("Texture",2D) = "white"{}//發(fā)現(xiàn)貼圖屬性_BumpMap("Bump",2D) = "bump"{}}SubShader {//表示渲染非透明物體Tags{"RenderType" = "Opaque"}//LOD默認(rèn)200,可以省略//CG代碼CGPROGRAM#pragma surface surf Lambert//版本可以省略#pragma//輸入的數(shù)據(jù)結(jié)構(gòu)體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;//在計算發(fā)現(xiàn)的時候,只需要調(diào)用UnpackNormal這個函數(shù)就可以實(shí)現(xiàn)//趨近的映射或者說UnpackNormal是對法線紋理的采樣方法,將法線紋理中的顏色映射回正確的法線向量o.Normal = UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap));}ENDCG}FallBack "Diffuse" }實(shí)例測試02:動態(tài)云圖
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;//輸入結(jié)構(gòu)體struct Input{float2 uv_MainTex;};void surf(Input IN,inout SurfaceOutput o){fixed xSpeed = _SpeedX*_Time*0.1;fixed ySpeed = _SpeedY*_Time*0.1;//根據(jù)輸入的紋理的uv信息和設(shè)置的速度得到要動態(tài)重新顯示的紋理上的uvfixed2 uv = IN.uv_MainTex - fixed2(xSpeed,ySpeed);//根據(jù)計算出的動態(tài)uv進(jìn)行像素點(diǎn)采樣fixed3 c = tex2D(_MainTex,uv);o.Albedo = c.rgb;o.Alpha = _Alpha;}ENDCG}FallBack "Diffuse" }總結(jié)
以上是生活随笔為你收集整理的Unity3DShader基础(CG)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC2005编译优化选项之玄机
- 下一篇: 我写的万年历插件(含天干地支,农历,阳历