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

