2026-10-27 08:41:36
光照计算需要从光源数据、模型表面材质结构、观察方向三个核心方向进行设计,并结合渲染路径(RenderPath)处理灯光数据传递和计算效率。以下是具体分析:
一、光源数据光源数据是光照计算的基础,其类型和传递方式直接影响最终效果:
方向光:仅需方向向量(LightDir)和颜色(LightColor),无衰减。
点光源/聚光灯:需位置、衰减系数(Attenuation)、光锥范围等额外参数。
前向渲染(Forward Rendering):通过顶点数据或像素着色器参数传递,每个灯光独立计算。
延迟渲染(Deferred Rendering):在光照阶段从G-Buffer读取表面属性,灯光数据以屏幕空间贴图或结构体传递。

材质属性决定光与表面的交互方式,需结合PBR理论实现物理真实感:
顶点法线用于基础光照计算(如漫反改族凳射)。
法线贴图通过扰动法线方向增加表面细节,无需增加几何复杂度。
光滑度控制高光范围,粗糙度影响微表面反射的模糊程度,二者互为反比。
在PBR中,粗糙度用于计算微表面分布函数(如GGX分布)。
金属度(Metallic):区分金属(高反射、低漫反射)与非金属(低反射、高漫反射)。
环境光遮蔽(AO):模拟表面微小凹陷处的阴影效果。
菲涅尔效应(Fresnel):表面反射率随观察角度变化,公式为:F = F0 + (1 - F0) * (1 - dot(N, V))^5其中 F0 为基础反射率,N 为法线,V 为观察方向。
观察方向(ViewDir)影响反射计算,尤其在镜面反射和高光处理中:
Blinn-Phong:使用半角向量(H)简化计算:H = normalize(L + V)Specular = (max(0, dot(N, H)))^Gloss * LightColor
Cook-Torrance:基于微表面理论,公式为:Specular = (D * F * G) / (4 * dot(N, L) * dot(N, V))其中 D(分布函数)、F(菲涅尔项)、G(几何函数)由粗糙度和法线决定。
渲染路径决定灯光数据的处理方式和计算效率:
Pass类型:
ForwardBase:处理主方向光和超出数量限制的灯光(作为顶点光),同时计算SH、LightMap等全局光照。
ForwardAdd:为每个额外灯光调用一次,结果通过Blend one one叠加。
适用场景:灯光数量较少(如移动端游戏),或需要深度定制光照的场景。核旅
阶段划分:
几何阶段(G-Buffer填充):存储法线、漫反射颜色、深度、材质属性(如金属度、粗糙度)到多个纹理缓冲区。
光照阶段(Lighting Pass):在屏幕空间遍历每个像素,结合G-Buffer数据和灯光参数计算光照。
优点:
动态光源处理高效,每个像素光照仅计算一次。
材质与光照解耦,支持复杂着色模型。
缺点:
显存占用高(需存储多个G-Buffer)。
透明物体需单独处理(无法写入G-Buffer)。
抗锯齿需依赖屏幕空间技术(如FXAA)。
延迟渲染通过多渲染目标(MRT)实现G-Buffer的高效填充:
RT0:法线(RGB) + 深度(A)。
RT1:漫反射颜色(RGB) + 金属度(A)。
RT2:光照信息(如粗糙度、环境光遮蔽)。
光照计算需综合光源类型、材质属性和观察方向,并结合渲染路径优化性能: