Three.js - código de sombreado para efecto halo, las normales necesitan transformación

Estoy intentando crear un sombreado para producir un efecto de halo brillante en Three.js. Mi intento actual es vivir aquí:http://stemkoski.github.io/Three.js/Shader-Halo.html

El código del sombreador es actualmente:

<script id="vertexShader" type="x-shader/x-vertex">
varying vec3 vNormal;
void main() 
{
    vNormal = normalize( normalMatrix * normal );
    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
</script>

<script id="fragmentShader" type="x-shader/x-vertex"> 
varying vec3 vNormal;
void main() 
{
    float intensity = pow( 0.7 - dot( vNormal, vec3( 0.0, 0.0, 1.0 ) ), 4.0 ); 
    gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0 ) * intensity;
}
</script>

Esto funciona bien siempre que el objeto permanezca en el centro de la escena. Después de hacer zoom o desplazarse, el efecto de halo parece cambiar de intensidad o se ve desviado, respectivamente.

Creo que entiendo por qué esto es matemáticamente. En este código, la intensidad del efecto de brillo está determinada por la coordenada z del vector normal a la malla, porque ese es el vector que mira el espectador, y por lo tanto debería aplique una transformación similar a (0,0,1) antes de calcular la intensidad.

Así llegué a

<script id="vertexShader" type="x-shader/x-vertex">
varying vec3 vNormal;
varying vec4 vector;
void main() 
{
    vNormal = normalize( normalMatrix * normal );
    vector = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 1.0, 0.0 );
    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
</script>

<script id="fragmentShader" type="x-shader/x-vertex"> 
varying vec3 vNormal;
varying vec4 vector;
void main() 
{
    vec4 v = vec4( vNormal, 0.0 );
    float intensity = pow( 0.7 - dot( v, vector ), 4.0 ); 
    gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0 ) * intensity;
}
</script>

que se ve completamente diferente a mi sombreador original, incluso cuando está en el origen, y continúa cambiando de aspecto a medida que me acerco y recorre la escena.

Estoy en una pérdida. ¿Alguien sabe cómo transformar el vector normal correctamente (o qué otro (s) cambio (s) se debe hacer) para que la apariencia producida por este sombreador no cambie cuando se acerca / desplaza la escena?

[Actualizar]

Parece que hay una ventaja prometedora enhttp://john-chapman-graphics.blogspot.com/2013/01/good-enough-volumetrics-for-spotlights.html

En particular,

Los bordes ... deben suavizarse de alguna manera, y ahí es donde entran los vértices normales. Podemos usar el producto puntual del espacio de vista normal (cnorm) con el vector de vista (la posición del fragmento normalizada, cpos) como una métrica que describe ¿Qué tan cerca del borde ... el fragmento actual es.

¿Alguien sabe el código para calcular el espacio de vista normal y el vector de vista?

Respuestas a la pregunta(1)

Su respuesta a la pregunta