Unity3D 在游戏引擎中常用的光照模型有哪些现详解
Unity3D是一款强大的游戏引擎,其在游戏开发中广泛应用于各种类型的游戏。光照模型是游戏引擎中一个重要的组成部分,它决定了游戏中的光照效果和物体的视觉效果。在Unity3D中,常用的光照模型有Lambert光照模型、Blinn-Phong光照模型和PBR(Physically Based Rendering)光照模型。
对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。
Lambert光照模型是最简单的光照模型之一,它只考虑了光照的方向和物体表面的法向量。在Lambert光照模型中,物体表面的颜色只与光源的方向和物体表面的法向量有关,与观察者的位置无关。其计算公式如下:
Copy
float3 lightDir = normalize(lightPosition - surfacePosition); // 光照方向 float3 normal = normalize(surfaceNormal); // 法向量 float diffuse = max(dot(lightDir, normal), 0); // 计算漫反射强度 float3 finalColor = objectColor * lightColor * diffuse; // 计算最终颜色
在这段代码中,lightDir
表示光照方向,normal
表示物体表面的法向量,diffuse
表示漫反射强度,objectColor
表示物体的颜色,lightColor
表示光源的颜色。
Blinn-Phong光照模型是一种更高级的光照模型,它在Lambert光照模型的基础上加入了镜面反射成分,使得物体表面能够呈现出光亮的效果。在Blinn-Phong光照模型中,除了考虑光照的方向和物体表面的法向量外,还需要考虑观察者的位置。其计算公式如下:
Copy
float3 lightDir = normalize(lightPosition - surfacePosition); // 光照方向 float3 viewDir = normalize(viewPosition - surfacePosition); // 观察方向 float3 halfDir = normalize(lightDir + viewDir); // 半向量 float3 normal = normalize(surfaceNormal); // 法向量 float diffuse = max(dot(lightDir, normal), 0); // 计算漫反射强度 float specular = pow(max(dot(normal, halfDir), 0), shininess); // 计算镜面反射强度 float3 finalColor = objectColor * lightColor * (diffuse + specular); // 计算最终颜色
在这段代码中,viewDir
表示观察方向,halfDir
表示光照方向和观察方向的半向量,shininess
表示物体的光泽度。
PBR光照模型是一种基于物理的光照模型,它模拟了真实世界中光的传播和反射的物理过程。PBR光照模型考虑了光的能量衰减、金属度和粗糙度等因素,使得物体表面的光照效果更加真实。在Unity3D中,PBR光照模型可以通过使用Standard Shader来实现。其计算公式如下:
Copy
float3 albedo = texture2D(albedoMap, uv).rgb; // 反射率贴图 float3 normal = UnpackNormal(texture2D(normalMap, uv)); // 法向量贴图 float3 viewDir = normalize(viewPosition - surfacePosition); // 观察方向 float3 lightDir = normalize(lightPosition - surfacePosition); // 光照方向 float3 halfDir = normalize(lightDir + viewDir); // 半向量 float3 F0 = mix(F0NonMetal, F0Metal, metallic); // 镜面反射率 float3 F = FresnelSchlick(dot(halfDir, viewDir), F0); // 菲涅尔项 float3 diffuse = albedo * (1 - F); // 漫反射 float3 specular = F * D * G / (4 * dot(normal, viewDir) * dot(normal, lightDir)); // 镜面反射 float3 finalColor = (diffuse + specular) * lightColor; // 计算最终颜色
在这段代码中,albedo
表示反射率,normal
表示法向量,viewDir
表示观察方向,lightDir
表示光照方向,halfDir
表示光照方向和观察方向的半向量,F0
表示镜面反射率,F
表示菲涅尔项,diffuse
表示漫反射,specular
表示镜面反射。
以上是Unity3D中常用的光照模型的详解和代码实现。通过使用这些光照模型,可以使游戏中的物体表面呈现出逼真的光照效果,提升游戏的视觉质量。在实际的游戏开发中,可以根据具体的需求和场景选择适合的光照模型,并根据需要进行调整和优化,以达到最佳的视觉效果。