Unity shader實(shí)現(xiàn)多光源漫反射以及陰影
本文實(shí)例為大家分享了shader實(shí)現(xiàn)多光源漫反射以及陰影的具體代碼,供大家參考,具體內(nèi)容如下
Shader "Unlit/MulLight" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { //一盞主燈 Pass { //Always: 總是渲染;沒有光照模式。 //ForwardBase: 適用于前渲染、環(huán)境、主要方向燈、光/sh光和烘焙圖。 //ForwardAdd: 適用于前渲染, 疊加每一盞燈,每一盞燈就多一個(gè)pass。 //Deferred: 延遲渲染,渲染g緩沖區(qū) 。 //ShadowCaster:將物體深度渲染到陰影貼圖或者深度紋理上 。 //PrepassBase: 用于傳統(tǒng)的延遲光照,渲染法線和高光效果。 //PrepassFinal:用于傳統(tǒng)的延遲光照,通過結(jié)合文理、燈光、和法線來渲染最終的結(jié)果。 //Vertex:當(dāng)對象不是光映射時(shí),用于遺留頂點(diǎn)的渲染,所有頂點(diǎn)燈都被利用。 //VertexLMRGBM: 當(dāng)對象被光映射時(shí),在遺留的頂點(diǎn)上使用渲染,在LightMap是RGBM編碼的平臺上(pc和控制臺)。 //VertexLM: 當(dāng)對象被光映射時(shí),在遺留的頂點(diǎn)上使用渲染,在LightMap是雙idr編碼的(移動(dòng)平臺)平臺上。 Tags { "RenderType"="Opaque" "LightMode" = "ForwardBase"}////// CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #pragma target 3.0 //衰減與陰影的實(shí)現(xiàn) #include "AutoLight.cginc"http:////// //fwdadd:ForwardBase的陰影顯示,在下面的ForwardAdd里得用fwdadd; 必須結(jié)合fallback,兩者缺一不可 #pragma multi_compile_fwdadd_fullshadows////// sampler2D _MainTex; float4 _MainTex_ST; //定義一個(gè)燈光,名字為固定格式,會自動(dòng)取場景中燈光 float4 _LightColor0;////// struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float4 normal:NORMAL;////// }; struct v2f { float2 uv : TEXCOORD0; float4 pos: SV_POSITION; float3 normal :TEXCOORD1;////// //點(diǎn)光源需要的衰減 LIGHTING_COORDS(3,4)//////#include "AutoLight.cginc" }; v2f vert (appdata v) { v2f o; //這里一般用 o.pos,用o.vertex有時(shí)候會報(bào)錯(cuò) o.pos= UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.normal = v.normal;////// //點(diǎn)光源需要的衰減 TRANSFER_VERTEX_TO_FRAGMENT(o)//////#include "AutoLight.cginc" return o; } fixed4 frag (v2f i) : SV_Target { //物體法向量轉(zhuǎn)化為世界法向量 float3 N = normalize(UnityObjectToWorldNormal(i.normal));////// //世界光向量:unity封裝好的光向量,會自動(dòng)調(diào)用場景里面的存在的燈光 float3 L =normalize( _WorldSpaceLightPos0.xyz);////// //點(diǎn)光源需要的衰減系數(shù) float atten = LIGHT_ATTENUATION(i);//////#include "AutoLight.cginc" fixed4 col = tex2D(_MainTex, i.uv); //最終顏色 = 主顏色 x( 燈光顏色 x 漫反射系數(shù) x衰減系數(shù) + 環(huán)境光) col.rgb = col.rgb * (_LightColor0.rgb* saturate(dot(N,L)) *atten + UNITY_LIGHTMODEL_AMBIENT);////// return col; } ENDCG } //多盞燈疊加 Pass////// { Tags { "RenderType"="Opaque" "LightMode" = "ForwardAdd"} //ForwardAdd :多燈混合////// Blend One One////// CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #pragma target 3.0 //衰減與陰影的實(shí)現(xiàn) #include "AutoLight.cginc"http:////// //fwdadd:ForwardAdd的陰影顯示,在上面的ForwardBase里得用fwdbase; 必須結(jié)合fallback,兩者缺一不可 #pragma multi_compile_fwdadd_fullshadows////// sampler2D _MainTex; float4 _MainTex_ST; //定義一個(gè)燈光,名字為固定格式,會自動(dòng)取場景中燈光 float4 _LightColor0;////// struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float4 normal:NORMAL;////// }; struct v2f { float2 uv : TEXCOORD0; float4 pos: SV_POSITION; float3 normal :TEXCOORD1;////// float4 wPos :TEXCOORD2;////// //點(diǎn)光源需要的衰減 LIGHTING_COORDS(3,4)//////#include "AutoLight.cginc" }; v2f vert (appdata v) { v2f o; //這里一般用 o.pos,用o.vertex有時(shí)候會報(bào)錯(cuò) o.pos= UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.wPos= mul(unity_ObjectToWorld, v.vertex);////// o.normal = v.normal;////// //點(diǎn)光源需要的衰減 TRANSFER_VERTEX_TO_FRAGMENT(o)//////#include "AutoLight.cginc" return o; } fixed4 frag (v2f i) : SV_Target { //物體法向量轉(zhuǎn)化為世界法向量 float3 N = normalize(UnityObjectToWorldNormal(i.normal));////// //世界光向量:這里計(jì)算的是點(diǎn)光源,按照燈光的距離來算衰減,第一個(gè)pass不需要 float3 L = normalize (lerp(_WorldSpaceLightPos0.xyz , _WorldSpaceLightPos0.xyz - i.wPos.xyz , _WorldSpaceLightPos0.w));////// //點(diǎn)光源需要的衰減 float atten = LIGHT_ATTENUATION(i);//////#include "AutoLight.cginc" fixed4 col = tex2D(_MainTex, i.uv); //最終顏色 = 主顏色 x 燈光顏色 x 漫反射系數(shù) x 衰減系數(shù) 第一個(gè)pass已經(jīng)有了環(huán)境色 這里就不能加了 col.rgb = col.rgb * _LightColor0.rgb * saturate(dot(N,L))*atten;////// return col; } ENDCG } } //需要產(chǎn)生陰影 FallBack "Diffuse" }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#中datagridview使用tooltip控件顯示單元格內(nèi)容的方法
這篇文章主要介紹了C#中datagridview使用tooltip控件顯示單元格內(nèi)容的方法,實(shí)例分析了C#控件的相關(guān)使用技巧,需要的朋友可以參考下2016-06-06C#使用Shader實(shí)現(xiàn)夜幕降臨倒計(jì)時(shí)的效果
這篇文章主要介紹了C#使用Shader實(shí)現(xiàn)夜幕降臨倒計(jì)時(shí)的效果,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10C#中FlagsAttribute屬性在enum中的應(yīng)用詳解
這篇文章主要介紹了C#中FlagsAttribute屬性在enum中的應(yīng)用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10WPF利用LiveCharts實(shí)現(xiàn)動(dòng)態(tài)曲線圖繪制
LiveCharts是一個(gè)比較漂亮的WPF圖表控件,在數(shù)據(jù)發(fā)生變化后,還可以設(shè)置相對于的動(dòng)畫效果,本文就來利用LiveCharts繪制簡單的動(dòng)態(tài)曲線圖吧2023-10-10Unity實(shí)現(xiàn)文本轉(zhuǎn)貼圖
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)文本轉(zhuǎn)貼圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05C#實(shí)現(xiàn)順序隊(duì)列和鏈隊(duì)列的代碼實(shí)例
今天小編就為大家分享一篇關(guān)于C#實(shí)現(xiàn)順序隊(duì)列和鏈隊(duì)列的代碼實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10