feat: IBL 阶段②——漫反射辐照度卷积,PBR ambient 接入环境光
- Cubemap 构造期同步 CPU 半球 Lambert 积分(64×32 网格 ≈2048 采样/像素) 生成 32² irradiance cube(漫反射是超低频信号,分辨率无需高) - shader:kD 用粗糙度感知 FresnelSchlickRoughness + (1-metallic), N 采样 irradianceMap(Set2 binding 3)替换常数 ambient; ambientColor 保留为强度/色调乘子 - CreateNeutral 兜底:无 HDR 资产时 1×1 常数 cube,描述符恒有效 - FaceDir 改为返回单位方向(equirect 查表要求,修掉未归一化的畸变)
This commit is contained in:
@@ -45,6 +45,7 @@ layout(set = 1, binding = 4) uniform MaterialParams {
|
||||
layout(set = 2, binding = 0) uniform sampler2D shadowMap0; // CSM 级联 0(最近)
|
||||
layout(set = 2, binding = 1) uniform sampler2D shadowMap1; // 级联 1
|
||||
layout(set = 2, binding = 2) uniform sampler2D shadowMap2; // 级联 2(最远)
|
||||
layout(set = 2, binding = 3) uniform samplerCube irradianceMap; // 漫反射环境光(IBL 阶段②)
|
||||
|
||||
// 第 0 盏方向光(KeyLight)的 CSM 阴影因子:0.3 影中 / 1.0 受光。
|
||||
// 级联按视图深度选择;采样器均 clamp-to-border 白色:
|
||||
@@ -104,6 +105,12 @@ vec3 FresnelSchlick(float cosTheta, vec3 F0) {
|
||||
return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
|
||||
}
|
||||
|
||||
// 粗糙度感知的 Fresnel(IBL 用):粗糙表面掠射边缘的 F 上升更平缓
|
||||
vec3 FresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness) {
|
||||
vec3 Fmax = max(vec3(1.0 - roughness), F0);
|
||||
return F0 + (Fmax - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
|
||||
}
|
||||
|
||||
void main() {
|
||||
vec3 albedo = texture(albedoMap, fragUV).rgb;
|
||||
vec4 mr = texture(metallicRoughnessMap, fragUV);
|
||||
@@ -159,8 +166,14 @@ void main() {
|
||||
Lo += (kD * albedo / PI + specular) * radiance * NdotL * shade;
|
||||
}
|
||||
|
||||
// 环境光:无 IBL 的简化版(半球常数);后续 IBL 替换
|
||||
vec3 ambient = ubo.ambientColor.rgb * albedo;
|
||||
// 环境光:漫反射辐照度(IBL 阶段②,split-sum 的 diffuse 项)。
|
||||
// N 采样预卷积的 irradiance cube(半球 Lambert 积分已在加载期完成);
|
||||
// kD 用粗糙度感知 Fresnel + (1-metallic)(金属无漫反射)。
|
||||
// ambientColor = 用户可调强度/色调乘子。镜面项待阶段③ BRDF LUT
|
||||
vec3 F_amb = FresnelSchlickRoughness(NdotV, F0, roughness);
|
||||
vec3 kD_amb = (1.0 - F_amb) * (1.0 - metallic);
|
||||
vec3 irradiance = texture(irradianceMap, N).rgb;
|
||||
vec3 ambient = kD_amb * irradiance * albedo * ubo.ambientColor.rgb;
|
||||
|
||||
vec3 color = ambient + Lo + emissive;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user