noteForOpenGL 阴影映射 Shadow Mapping 完整教程:阴影痤疮、Bias 调优与 PCF 软阴影 5 步实战指南

noteForOpenGL 阴影映射 Shadow Mapping 完整教程:阴影痤疮、Bias 调优与 PCF 软阴影 5 步实战指南 noteForOpenGL 阴影映射 Shadow Mapping 完整教程阴影痤疮、Bias 调优与 PCF 软阴影 5 步实战指南【免费下载链接】noteForOpenGLOpenGL学习脚印配套代码项目地址: https://gitcode.com/gh_mirrors/no/noteForOpenGL 本教程基于开源项目noteForOpenGLOpenGL 学习脚印配套代码中的 advancedLighting/shadowMapping/ 模块编写带你从零搭建阴影映射Shadow Mapping渲染管线生成深度贴图、诊断并修复阴影痤疮Shadow Acne、用 Bias 偏置量精准调优、最终通过 PCF 实现软阴影。全程配有项目真实渲染截图跟着 5 个步骤即可独立复刻效果。 核心原理两遍渲染Pass 1 Pass 2阴影映射的思路非常直观核心是两次绘制Pass 1深度贴图 Pass把相机搬到光源位置把整个场景渲染成一张深度图Depth Map——记录每个像素离光源的最近距离Pass 2光照 Pass正常渲染场景对每个片元询问我离光源的距离是否比深度图里记录的距离更远是则被遮挡落在阴影中。在 shadowMapping.cpp 中Pass 1 使用正交投影矩阵glm::ortho(-10, 10, -10, 10, 1.0, 7.5)把场景写进 1024×1024 的深度 FBOPass 2 再把深度贴图采样到光照着色器里完成比较。第 1 步生成并可视化深度贴图入门项目 shadowMapping1/shadowMapping.cpp 只做一件事从光源视角绘制场景然后用一个屏幕四边形把深度图回放出来。这是调试阴影映射最重要的手段——深度图哪里不对阴影就一定不对。 配套着色器depthMap.vertex、viewDepth.frag深度值被线性化后映射为黑白灰方便肉眼检查。第 2 步第一次阴影比较遇见阴影痤疮把深度图接到光照着色器中用一行比较currentDepth closestDepth就能得到阴影——但立刻会看到经典的阴影痤疮Shadow Acne物体表面长出斑驳的阴影点。原因深度图分辨率有限 浮点精度误差片元深度和最近深度几乎相等时比较结果随机抖动。第 3 步Bias 偏置量修复阴影痤疮给当前深度减一个**偏置量Bias**再比较即可消除痤疮。关键在 scene.frag 中的动态 Bias 公式固定偏置currentDepth - bias closestDepth简单但偏置给大一点阴影就会和物体脱节产生彼得潘效应Peter Panning法线相关偏置bias max(0.05 * (1.0 - dot(normal, lightDir)), 0.005f)面越平行于光线偏置越大既消除了痤疮又最大限度避免脱节。左右对比一下偏置过大脱节与法线偏置贴合的差异问题现象项目截图Peter Panning阴影与物体分离见 peterPanning.png法线相关 Bias阴影紧贴物体见 noPeterPanning.png第 4 步处理光源视锥之外的区域超出光源视锥Far Plane 之外的片元深度值会回绕成 0 附近导致本该受光的区域被错误地画上阴影。修复只需一个判断深度大于 1.0 的片元直接返回不受阴影if (currentDepth 1.0) return 0.0f;。另外注意深度纹理的环绕方式使用GL_REPEAT会在视锥边缘产生镜像伪影正确做法是GL_CLAMP_TO_BORDER并把边框颜色设为 1.0代表无穷远项目用 prepareDepthFBO2 演示了这一修复第 5 步PCF 软阴影——一次采样升级为 9 次硬阴影的边缘像剪纸锯齿明显。**PCFPercentage-Closer Filtering百分比接近过滤**的思路是不只采样当前像素而是把周围 3×3 的邻域都采样一遍统计落在阴影中的比例让阴影边缘自然过渡。实现就在 scene.frag 的calculateShadow4中双层循环 9 次采样结果除以 9 得到 0~1 的软阴影系数。调参提示在 shadowMapping.cpp 中按B键开关阴影、P键开关 PCF实时对比效果。 进阶模型阴影与点光源阴影加载真实模型shadowMappingWithModel/ 用 Assimp 加载纳米战斗服模型路径见 modelPath.txt阴影映射流程与立方体完全一致可直接复用上文的 Bias 与 PCF 技术。点光源阴影点光向四面八方发射单个 2D 深度图不够用需要 6 面深度立方体Cube Map。advancedLighting/pointShadow/ 提供了两种实现——多 Pass 渲染 6 个方向以及用几何着色器一次绘制 6 个方向depthMap.gs 项目文件导航模块路径说明深度图入门advancedLighting/shadowMapping/shadowMapping1/Pass 1 生成深度贴图并可视化阴影核心advancedLighting/shadowMapping/shadowMapping2/阴影比较、Bias、视锥裁剪、PCF 软阴影模型版advancedLighting/shadowMapping/shadowMappingWithModel/Assimp 加载模型 阴影映射点光阴影advancedLighting/pointShadow/多 Pass 与几何着色器两种方案光照基础lighting/方向光、点光、聚光灯等前置知识运行环境libraries/项目配套的 GLEW/GLFW/Glm 库✅ 总结阴影映射调优清单先看深度图——用 Pass 2 的四边形可视化问题无处遁形出现斑驳痤疮→ 加 Bias优先用1 - dot(normal, lightDir)动态偏置阴影脱节→ 减小 Bias 系数不要一刀切给大值边缘伪影→ 深度纹理改GL_CLAMP_TO_BORDER 边框值 1.0视锥外乱阴影→ 深度 1.0 直接判不受光边缘太硬→ 上 PCF3×3 邻域采样取平均。按这份清单走完 advancedLighting/shadowMapping/ 下的三个递进工程你就掌握了实时渲染中阴影效果的完整调优链路 【免费下载链接】noteForOpenGLOpenGL学习脚印配套代码项目地址: https://gitcode.com/gh_mirrors/no/noteForOpenGL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考