Unity shader实现多光源漫反射以及阴影
本文实例为大家分享了shader实现多光源漫反射以及阴影的具体代码,供大家参考,具体内容如下
Shader"Unlit/MulLight"
{
Properties
{
_MainTex("Texture",2D)="white"{}
}
SubShader
{
//一盏主灯
Pass
{
//Always:总是渲染;没有光照模式。
//ForwardBase:适用于前渲染、环境、主要方向灯、光/sh光和烘焙图。
//ForwardAdd:适用于前渲染,叠加每一盏灯,每一盏灯就多一个pass。
//Deferred:延迟渲染,渲染g缓冲区。
//ShadowCaster:将物体深度渲染到阴影贴图或者深度纹理上。
//PrepassBase:用于传统的延迟光照,渲染法线和高光效果。
//PrepassFinal:用于传统的延迟光照,通过结合文理、灯光、和法线来渲染最终的结果。
//Vertex:当对象不是光映射时,用于遗留顶点的渲染,所有顶点灯都被利用。
//VertexLMRGBM:当对象被光映射时,在遗留的顶点上使用渲染,在LightMap是RGBM编码的平台上(pc和控制台)。
//VertexLM:当对象被光映射时,在遗留的顶点上使用渲染,在LightMap是双idr编码的(移动平台)平台上。
Tags{"RenderType"="Opaque""LightMode"="ForwardBase"}//////
CGPROGRAM
#pragmavertexvert
#pragmafragmentfrag
#include"UnityCG.cginc"
#pragmatarget3.0
//衰减与阴影的实现
#include"AutoLight.cginc"//////
//fwdadd:ForwardBase的阴影显示,在下面的ForwardAdd里得用fwdadd;必须结合fallback,两者缺一不可
#pragmamulti_compile_fwdadd_fullshadows//////
sampler2D_MainTex;
float4_MainTex_ST;
//定义一个灯光,名字为固定格式,会自动取场景中灯光
float4_LightColor0;//////
structappdata
{
float4vertex:POSITION;
float2uv:TEXCOORD0;
float4normal:NORMAL;//////
};
structv2f
{
float2uv:TEXCOORD0;
float4pos:SV_POSITION;
float3normal:TEXCOORD1;//////
//点光源需要的衰减
LIGHTING_COORDS(3,4)//////#include"AutoLight.cginc"
};
v2fvert(appdatav)
{
v2fo;
//这里一般用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"
returno;
}
fixed4frag(v2fi):SV_Target
{
//物体法向量转化为世界法向量
float3N=normalize(UnityObjectToWorldNormal(i.normal));//////
//世界光向量:unity封装好的光向量,会自动调用场景里面的存在的灯光
float3L=normalize(_WorldSpaceLightPos0.xyz);//////
//点光源需要的衰减系数
floatatten=LIGHT_ATTENUATION(i);//////#include"AutoLight.cginc"
fixed4col=tex2D(_MainTex,i.uv);
//最终颜色=主颜色x(灯光颜色x漫反射系数x衰减系数+环境光)
col.rgb=col.rgb*(_LightColor0.rgb*saturate(dot(N,L))*atten+UNITY_LIGHTMODEL_AMBIENT);//////
returncol;
}
ENDCG
}
//多盏灯叠加
Pass//////
{
Tags{"RenderType"="Opaque""LightMode"="ForwardAdd"}//ForwardAdd:多灯混合//////
BlendOneOne//////
CGPROGRAM
#pragmavertexvert
#pragmafragmentfrag
#include"UnityCG.cginc"
#pragmatarget3.0
//衰减与阴影的实现
#include"AutoLight.cginc"//////
//fwdadd:ForwardAdd的阴影显示,在上面的ForwardBase里得用fwdbase;必须结合fallback,两者缺一不可
#pragmamulti_compile_fwdadd_fullshadows//////
sampler2D_MainTex;
float4_MainTex_ST;
//定义一个灯光,名字为固定格式,会自动取场景中灯光
float4_LightColor0;//////
structappdata
{
float4vertex:POSITION;
float2uv:TEXCOORD0;
float4normal:NORMAL;//////
};
structv2f
{
float2uv:TEXCOORD0;
float4pos:SV_POSITION;
float3normal:TEXCOORD1;//////
float4wPos:TEXCOORD2;//////
//点光源需要的衰减
LIGHTING_COORDS(3,4)//////#include"AutoLight.cginc"
};
v2fvert(appdatav)
{
v2fo;
//这里一般用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"
returno;
}
fixed4frag(v2fi):SV_Target
{
//物体法向量转化为世界法向量
float3N=normalize(UnityObjectToWorldNormal(i.normal));//////
//世界光向量:这里计算的是点光源,按照灯光的距离来算衰减,第一个pass不需要
float3L=normalize(lerp(_WorldSpaceLightPos0.xyz,_WorldSpaceLightPos0.xyz-i.wPos.xyz,_WorldSpaceLightPos0.w));//////
//点光源需要的衰减
floatatten=LIGHT_ATTENUATION(i);//////#include"AutoLight.cginc"
fixed4col=tex2D(_MainTex,i.uv);
//最终颜色=主颜色x灯光颜色x漫反射系数x衰减系数第一个pass已经有了环境色这里就不能加了
col.rgb=col.rgb*_LightColor0.rgb*saturate(dot(N,L))*atten;//////
returncol;
}
ENDCG
}
}
//需要产生阴影
FallBack"Diffuse"
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。