假设我们对游戏中的不同对象有不同的着色器程序。例如,玩家模型有一个控制骨架系统(骨骼矩阵乘法等)的着色器,或者一个粒子有一个用于闪烁效果的着色器,墙壁有视差映射等。
但是,如果我想在游戏中添加必须影响这些对象中的每一个的雾怎么办?例如,我有一个房间会有红雾,我应该将每个 glsl 程序更改为有雾代码还是有可能制作全局过滤器的方法?当我想添加一个功能时,我应该更改每个 glsl 程序吗?
这类事情的典型过程是在后期处理中使用全屏着色器,使用来自完全渲染场景的深度缓冲区,或者使用仅渲染到深度缓冲区的 z-pass。您可以将它们链接在一起并创建任意数量的效果。它通常涉及一些渲染到纹理的工作,并不是一项真正的琐碎任务(在这里发布代码太多了),但也不是那么困难。
如果你想看看一个像样的后处理系统,看看 Torque3D 中的 PostFx 系统:
https://github.com/GarageGames/Torque3D
下面是在 post 中使用 GLSL 创建雾的示例:
http://isnippets.blogspot.com/2010/10/real-time-fog-using-post-processing-in.html