应用PBR方向光时阴影无法渲染的问题排查与修复咨询
PBR管线硬阴影不显示问题解决方案
根因分析
- 环境光未参与阴影计算,且直接光贡献占比过低
当前代码中环境光ambient固定为基色的0.3倍,完全不受阴影系数影响,同时你注释掉了直接光的辐射度缩放参数u_material.radiance,导致直接光的贡献强度极低,阴影区域(直接光贡献为0)和非阴影区域的亮度差极小,肉眼无法区分。这是最核心的问题,你测试Blinn-Phong时阴影正常,就是因为Blinn-Phong实现中一般直接光占比更高,对比度足够。 - PBR光照计算函数返回值未初始化
CalculateDirectionalLight函数中的局部变量result没有初始化为vec3(0.0),GLSL中未初始化的局部变量会携带随机垃圾值,可能导致直接光计算结果异常,进一步抹平阴影的亮度差异。
修复方案
- 初始化光照计算结果变量,修改
CalculateDirectionalLight函数的首行代码:
vec3 result = vec3(0.0f);
- 补全方向光强度参数,放开注释的辐射度缩放,或临时增加固定强度系数提升直接光占比:
// 3.0为测试用强度系数,可根据场景明暗需求调整 result += (diffuse + specular) * 3.0f * NdotL;
- 调整环境光的阴影适配,提升阴影对比度:
如果希望阴影更明显,可以给环境光增加部分阴影关联逻辑,避免阴影区域太亮:
// 环境光保留30%基础亮度不受阴影影响,剩余70%随阴影系数变化 vec3 ambient = u_material.baseColor.rgb * 0.3f * (0.3 + 0.7 * shadow);
也可以直接调低全局环境光系数,突出直接光的明暗差异:
vec3 ambient = u_material.baseColor.rgb * 0.1f;
内容的提问来源于stack exchange,提问作者BrodaJarek3
相关产品推荐
相关产品推荐

