Three.js - código de shader para efeito de halo, as normais precisam de transformação

Eu estou tentando criar um sombreador para produzir um efeito de halo brilhante em Three.js. Minha tentativa atual é ao vivo aqui:http://stemkoski.github.io/Three.js/Shader-Halo.html

O código do shader está atualmente:

<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>

Isso funciona bem, desde que o objeto permaneça no centro da cena. Após o zoom ou o movimento panorâmico, o efeito halo parece alterar a intensidade ou parecer desequilibrado, respectivamente.

Eu acho que entendo porque isso é, matematicamente - neste código, a intensidade do efeito de brilho é determinada pela coordenada z do vetor normal para a malha, porque esse é o vetor voltado para o observador, e assim eu deveria de alguma forma aplique uma transformação semelhante a (0,0,1) antes de calcular a intensidade.

Assim cheguei 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 parece completamente diferente do meu shader original, mesmo quando na origem, e continua a mudar a aparência conforme eu zoom e desloco a cena.

Eu estou perdido. Alguém sabe como transformar corretamente o vetor normal (ou que outra (s) alteração (ões) deve (m) ser feita) para que a aparência produzida por este sombreador não mude quando o zoom / panorâmica da cena?

[Atualizar]

Parece haver uma vantagem promissora emhttp://john-chapman-graphics.blogspot.com/2013/01/good-enough-volumetrics-for-spotlights.html

Em particular,

As bordas ... precisam ser suavizadas de alguma forma, e é aí que as normais do vértice entram. Podemos usar o produto escalar do espaço de visão normal (cnorm) com o vetor de exibição (a posição do fragmento normalizado, cpos) como uma métrica descrevendo como quão perto da borda ... o fragmento atual é.

Alguém sabe o código para calcular o espaço de visão normal e o vetor de exibição?

questionAnswers(1)

yourAnswerToTheQuestion