Если вы не хотите касаться своего основного алгоритма (как предложил Майкл Даум в своем комментарии), вы можете заменить некоторые части своего кода:
uniform mat4 infiniteProjectionMatrix;
if(...) {
...
} else {
gl_Position = infiniteProjectionMatrix * vec4(lightDir, 0.0);
}
где infiniteProjectionMatrix - настраиваемая матрица проекции, в которой дальняя плоскость установлена на бесконечность (см. http://www.terathon.com/gdc07_lengyel.pdf на слайде 7) и выглядит примерно так:
* 0 0 0
0 * 0 0
0 0 -1 *
0 0 -1 0
Поскольку вы проецируете на бесконечность, вам не нужен масштабный коэффициент "100000.0", а смещением "gl_ModelViewMatrix * gl_Vertex" можно пренебречь (по сравнению с бесконечной длиной вектора lightDir).