在Unity游戏开发中,光源是构建一个丰富多彩游戏世界的重要元素。正确使用光源可以极大地增强游戏场景的氛围和视觉效果。本文将全面解析Unity中各种光源类型及其应用,帮助开发者更好地理解并运用光源来提升游戏质量。
基础光源类型
在Unity中,主要有以下几种光源类型:
1. 点光源(Point Light)
点光源是从一个点向四周发射光线的光源。这种光源适用于模拟灯泡、篝火等场景。点光源的特点是其亮度随距离的增加而衰减。
public class PointLight : MonoBehaviour
{
public Light pointLight;
void Start()
{
pointLight = gameObject.AddComponent<Light>();
pointLight.type = LightType.Point;
}
}
2. 面光源(Area Light)
面光源是一种二维的光源,可以产生类似于灯光照射到墙壁上的效果。它适用于模拟灯带、灯箱等场景。
public class AreaLight : MonoBehaviour
{
public Light areaLight;
void Start()
{
areaLight = gameObject.AddComponent<Light>();
areaLight.type = LightType.Directional;
areaLight.spotAngle = 90.0f;
areaLight.renderMode = LightRenderMode.Spotlight;
}
}
3. 聚光灯(Spot Light)
聚光灯是从一个点向特定方向发射光线的光源。它适用于模拟手电筒、探照灯等场景。聚光灯具有锥形照射区域,可以通过调整锥形角度来控制照射范围。
public class SpotLight : MonoBehaviour
{
public Light spotLight;
void Start()
{
spotLight = gameObject.AddComponent<Light>();
spotLight.type = LightType.Spotlight;
spotLight.spotAngle = 45.0f;
}
}
4. 环形光源(Ring Light)
环形光源是一种圆形的光源,适用于模拟环形灯带、摄像头等场景。
public class RingLight : MonoBehaviour
{
public Light ringLight;
void Start()
{
ringLight = gameObject.AddComponent<Light>();
ringLight.type = LightType.Area;
ringLight.renderMode = LightRenderMode.Ring;
ringLight.spotAngle = 360.0f;
}
}
光照模型
Unity中主要有以下几种光照模型:
1. 线性光照模型(Blinn-Phong)
线性光照模型是最常用的光照模型之一。它通过计算光、半影和环境光来模拟光线照射到物体上的效果。
Shader "Custom/Blinn-Phong"
{
Properties
{
_Color ("Base Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
fixed4 _Color;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float3 worldPos : TEXCOORD1;
float3 viewDir : TEXCOORD2;
float3 normal : TEXCOORD3;
};
v2f vert (appdata v)
{
v2f o;
o.uv = v.uv;
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
o.viewDir = normalize(eyePos - o.worldPos);
o.normal = normalize(mul(unity_ObjectToWorld,unity_MotionVectors).xyz);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed3 albedo = _Color.rgb;
fixed3 normalDir = normalize(i.normal);
fixed3 viewDir = normalize(i.viewDir);
fixed3 lightDir = normalize(-lightData0.direction);
fixed3 halfwayDir = normalize(reflect(lightDir, normalDir));
fixed f = dot(lightDir, normalDir);
fixed3 ambient = ambientLight.rgb * albedo;
fixed3 diffuse = lightColor.rgb * f * albedo;
fixed3 specular = pow(max(dot(viewDir, halfwayDir), 0), 32) * _Glossiness;
return fixed4(saturate(ambient + diffuse + specular), 1);
}
ENDCG
}
}
}
2. 高光光照模型(Toon Shader)
高光光照模型通过将光照强度限制在几个特定的颜色值上,来模拟卡通风格的阴影和高光效果。
Shader "Custom/Toon Shader"
{
Properties
{
_Color ("Base Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
fixed4 _Color;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float3 worldPos : TEXCOORD1;
float3 viewDir : TEXCOORD2;
float3 normal : TEXCOORD3;
};
v2f vert (appdata v)
{
v2f o;
o.uv = v.uv;
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
o.viewDir = normalize(eyePos - o.worldPos);
o.normal = normalize(mul(unity_ObjectToWorld,unity_MotionVectors).xyz);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed3 albedo = _Color.rgb;
fixed3 normalDir = normalize(i.normal);
fixed3 viewDir = normalize(i.viewDir);
fixed3 lightDir = normalize(-lightData0.direction);
fixed3 halfwayDir = normalize(reflect(lightDir, normalDir));
fixed f = dot(lightDir, normalDir);
fixed3 ambient = ambientLight.rgb * albedo;
fixed3 diffuse = lightColor.rgb * f * albedo;
fixed3 specular = pow(max(dot(viewDir, halfwayDir), 0), 32) * _Glossiness;
fixed toon = saturate(f);
return fixed4(toon * ambient + toon * diffuse + toon * specular, 1);
}
ENDCG
}
}
}
总结
通过本文的介绍,相信您已经对Unity中的光源类型及其应用有了更深入的了解。在实际开发中,根据场景需求选择合适的光源类型和光照模型,可以为您的游戏世界带来更加丰富的视觉效果。希望本文能对您的游戏开发之路有所帮助。
