尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

noteForOpenGL 延迟着色Deferred Shading:用G-Buffer突破多光源性能瓶颈

noteForOpenGL 延迟着色Deferred Shading:用G-Buffer突破多光源性能瓶颈 noteForOpenGL 延迟着色Deferred Shading用G-Buffer突破多光源性能瓶颈【免费下载链接】noteForOpenGLOpenGL学习脚印配套代码项目地址: https://gitcode.com/gh_mirrors/no/noteForOpenGLnoteForOpenGL是一个 OpenGL 学习脚印配套代码项目其中advancedLighting/deferredShading目录完整实现了延迟着色Deferred Shading通过 G-Buffer 把几何信息与光照计算拆成两个 Pass一次绘制即可处理 32 个点光源轻松突破前向渲染的多光源性能瓶颈。本文将带你快速搞懂它的原理与实现。为什么前向着色扛不住多光源在前向渲染Forward Shading中每增加一个光源片元着色器都要完整执行一遍。10 个点光源就意味着 10 次场景绘制 10 倍光照计算量帧率会随光源数线性崩塌。延迟着色换了一种思路几何 Pass只把片元的位置、法线、漫反射颜色等原始数据写入 G-Buffer一组 FBO 附件纹理不做任何光照计算光照 Pass全屏绘制一个四边形片元着色器从 G-Buffer 中采样这些纹理对任意多个光源统一做 Blinn-Phong 光照。这样无论场景中有多少光源几何绘制永远只做一遍光照成本与光源数量解耦。完整流程图如下拆解G-Buffer3张纹理各存什么示例代码 gBuffer.frag 定义了 3 个输出附件附件存储内容精度说明gPosition(COLOR_ATTACHMENT0)片元在世界空间的位置高精度浮点纹理gNormal(COLOR_ATTACHMENT1)归一化后的世界空间法线高精度浮点纹理gAlbedoAndSpec(COLOR_ATTACHMENT2)RGB 存漫反射颜色A 通道存镜面强度8 位纹理即可deferredShading.cpp 中通过glFramebufferTexture2D把三张纹理分别绑定到 FBO 的三个颜色附件上。示例程序支持按键盘 1~5 切换查看各通道非常直观① 位置通道 G-Position颜色渐变反映片元在视空间中的远近越近越饱和② 法线通道 G-Normal把 RGB 分量映射成颜色红色代表 X 轴、绿色代表 Y 轴、蓝色代表 Z 轴方向③ 漫反射通道 G-Albedo即模型采样到的漫反射纹理原色④ 镜面强度通道 G-Specular白亮区域表示镜面反射能力强的部位如胸部装甲光照Pass一次循环点亮32个光源光照 Pass 的着色器 scene.frag 是延迟着色的灵魂核心逻辑先从 3 张 G-Buffer 纹理中采回FragPos、FragNormal、DiffuseColor和镜面强度把viewDir等与光源无关的量提到循环外避免 32 次重复计算遍历lights[32]数组逐个累加环境光、漫反射Lambert、镜面高光Blinn-Phong以及二次衰减attenuation 1 / (1 linear·d quadratic·d²)。CPU 端用glUniform*一次性把 32 个LightAttr位置、漫反射颜色、镜面颜色、衰减系数批量上传给着色器然后只调用一次全屏四边形绘制就完成整个场景的光照——这正是突破多光源性能瓶颈的关键所在。上手建议想跑起来完整示例位于 advancedLighting/deferredShading/deferredShading1/依赖 Assimp 加载纳米战斗服模型模型路径见 modelPath.txt调试技巧按 1~5 切换最终光照 / 位置 / 法线 / 漫反射 / 镜面强度五种视图快速定位 G-Buffer 数据错误注意G-Buffer 是带宽大户三张全屏纹理会显著增加填充率压力这正是延迟着色与前向着色的经典取舍。 掌握 G-Buffer 拆分后你可以继续挑战 HDR 色调映射advancedLighting/HDR-toneMapping/或 Bloom 辉光advancedLighting/Bloom/把延迟着色管线玩出更多花样。【免费下载链接】noteForOpenGLOpenGL学习脚印配套代码项目地址: https://gitcode.com/gh_mirrors/no/noteForOpenGL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表