时间:2025-09-18 12:58
人气:
作者:admin
【从UnityURP开始探索游戏渲染】专栏-直达
漫反射遵循兰伯特定律(Lambert's Cosine Law),其核心流程如下:
$漫反射 = 光源颜色 × 表面反照率 × max(0, N·L)$
漫反射遵循兰伯特定律(Lambert's Law),描述光线在粗糙表面均匀散射的现象。其核心特点是:
$Cdiffuse=(Clight*Mdiffuse)max(0,n·I)$
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));
$Cdiffuse=(Clight*Mdiffuse)(a(n·I)+b)$
绝大多数a和b都为0.5
$Cdiffuse=(Clight*Mdiffuse)(0.5(n·I)+0.5)$
URP中的漫反射计算主要分布在以下文件:
Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlslUnityURP_漫反射实现
hlsl
// 简化版Lambert漫反射实现
half3 DiffuseLighting(Light light, half3 normalWS, half3 albedo)
{
half NdotL = saturate(dot(normalize(normalWS), light.direction));
return light.color * albedo * NdotL;
}
// 完整光照计算入口
half3 UniversalFragmentBlinnPhong(InputData inputData, SurfaceData surfaceData)
{
// 初始化光照结果
half3 color = surfaceData.emission;
// 主光源漫反射计算
Light mainLight = GetMainLight();
color += DiffuseLighting(mainLight, inputData.normalWS, surfaceData.albedo);
// 附加光源计算
uint pixelLightCount = GetAdditionalLightsCount();
for (uint lightIndex = 0; lightIndex < pixelLightCount; ++lightIndex)
{
Light light = GetAdditionalLight(lightIndex, inputData.positionWS);
color += DiffuseLighting(light, inputData.normalWS, surfaceData.albedo);
}
return color;
}
在URP着色器中调用漫反射的标准方式:
hlsl
// 片元着色器示例
half4 frag(Varyings input) : SV_Target
{
// 初始化表面数据
SurfaceData surfaceData;
InitializeStandardLitSurfaceData(input.uv, surfaceData);
// 准备光照输入数据
InputData inputData;
InitializeStandardLitInputData(input, surfaceData.normalTS, inputData);
// 计算漫反射光照
half4 color = UniversalFragmentBlinnPhong(inputData, surfaceData);
return color;
}
在URP中,这种实现方式既保持了经典光照模型的直观性,又通过现代渲染管线的优化手段确保了高性能表现,特别适合需要跨平台部署的项目。
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,????)