За раз - значит за раз, а не за кадр.
Ты можешь отрисовать часть сцены с одним шейдером, часть сцены с другим.
Смотри, разобью твою задачу на шаги:
Тебе надо наложить на сцену туман. Например, из той статьи, volumetric fog. Там подробно описано как всё это делается.
Что тебе требуется сделать:
- Отключить стандартный туман, если надо, конечно.
- Перехватить финальный кадр сцены и наложить на него туман. Как это делается: в shaderGroup тебе даётся ссылка на ванильный framebuffer, где в прикреплённой текстуре содержится отрисованная сцена на текущий момент. В эту текстурку можно рисовать, поэтому тебе надо сделать копию этой текстуры (с одной текстурой нельзя одновременно проводить операции чтения\записи ввиду устройства GPU), из которой ты будешь читать данные (а именно глубину пикселя (точки) в координатах камеры для вычисления цвета тумана), и рисовать в ту, из которой копировал.
(примечание: кстати, скорее всего в твоём случае можно не копировать текстуру, а просто сразу сразу отдавать нужный цвет, если тебе подойдет применение этого шейдера для отрисовки полноэкранного квада)
- Перед этим тебе понадобится, как указано в статье, в две отдельные текстуры дополнитель нарисовать меш, описывающий туман, с двумя разными параметрами отрисовки, это необходимо для вычисления плотности тумана в точке.
- Ну и наконец, собрать всё воедино, отправить все нужные данные в шейдер, описанный во втором шаге, и запустить его в конце кадра, после чего отрисовать всю текстуру сцены на полноэкранный квад.
LWJGL - клёвая штука, переадресовывающая вызовы нативному OpenGL. Короче, шагом марш читать туториалы по LWJGL и рисовать треугольнички в отдельных окошках.