Diffuse贴图+Lightmap+Ambient

时间:2023-12-30 16:18:20

  shader里面光照计算毕竟还是比较复杂的,于是想到下面的性能相对好一些的方案。

  美术提供一张Diffuse贴图,一张lightmap贴图,然后在应用一个自定义的全局的环境光效果,来模拟静态的光照。

  每个模型单独提供自己的lightmap贴图,而不是使用场景烘焙出来的包含所有物体的liangmap,这样做的好处是比较灵活,同一个物体在不同地方提供不同的lightmap贴图即可。

Shader "James/Scene/Diffuse Lightmap"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_Lightmap ("Light Map", 2D) = "white" {}
} SubShader
{
Tags { "RenderType"="Opaque" "Queue"="Geometry" }
LOD Pass
{
Tags { "LightMode"="ForwardBase" }
Lighting Off CGPROGRAM
#pragma fragmentoption ARB_precision_hint_fastest #pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog #include "UnityCG.cginc"
#include "JamesLighting.cginc" uniform sampler2D _MainTex;
uniform half4 _MainTex_ST; UNITY_DECLARE_TEX2D(_Lightmap); struct vertexIN_base
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
float2 uv2 : TEXCOORD1;
}; struct v2f_base
{
float4 pos : SV_POSITION;
half4 uv : TEXCOORD0;
UNITY_FOG_COORDS()
}; inline half3 JamesDecodeLightmapDoubleLDR( half4 color)
{
#if defined(UNITY_COLORSPACE_GAMMA)
return color.rgb * ;
#else
return color.rgb * 4.59;
#endif
} v2f_base vert(vertexIN_base v)
{
v2f_base o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
o.uv.zw = v.uv2; UNITY_TRANSFER_FOG(o,o.pos);
return o;
} fixed4 frag(v2f_base i) : COLOR
{
half4 bakedColorTex = UNITY_SAMPLE_TEX2D(_Lightmap, i.uv.zw);
half3 bakedColor = JamesDecodeLightmapDoubleLDR(bakedColorTex); half4 mainColor = tex2D(_MainTex, i.uv.xy);
half4 clr = mainColor;
clr.rgb *= bakedColor + (AMBIENT_COLOR).rgb; UNITY_APPLY_FOG(i.fogCoord,clr); return clr;
}
ENDCG
}
}
FallBack Off
}