Unity3DShader基础(CG)
生活随笔
收集整理的這篇文章主要介紹了
Unity3DShader基础(CG)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Shader分為三種著色器:1.固定管線著色器,2.表面著色器,頂點和片元著色器
1.固定管線著色器:
小測試,寫一個簡單的效果,讓草坪貼圖看起來更真實:
代碼如下:
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC2005编译优化选项之玄机
- 下一篇: 我写的万年历插件(含天干地支,农历,阳历