Three.js - код шейдера для эффекта ореола, нормали нуждаются в преобразовании

Я пытаюсь создать шейдер для создания эффекта светящегося ореола в Three.js. Моя текущая попытка жить здесь:http://stemkoski.github.io/Three.js/Shader-Halo.html

Код шейдера в настоящее время:


varying vec3 vNormal;
void main() 
{
    vNormal = normalize( normalMatrix * normal );
    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}


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

Это работает нормально, если объект остается в центре сцены. После увеличения или панорамирования эффект ореола, по-видимому, меняет интенсивность или выглядит однобоким, соответственно.

Я думаю, я понимаю, почему это математически - в этом коде интенсивность эффекта свечения определяется координатой z вектора нормали к сетке, потому что это вектор, обращенный к зрителю, и поэтому я должен как-то примените аналогичное преобразование к (0,0,1) перед вычислением интенсивности.

Таким образом я достиг


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 );
}


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

который совершенно отличается от моего оригинального шейдера даже в исходном положении и продолжает изменять внешний вид, когда я масштабирую и панорамирую сцену.

Я в растерянности. Кто-нибудь знает, как правильно преобразовать вектор нормали (или какие другие изменения должны быть сделаны), чтобы внешний вид, создаваемый этим шейдером, не изменялся при масштабировании / панорамировании сцены?

[Обновить]

Кажется, есть многообещающее преимущество вhttp://john-chapman-graphics.blogspot.com/2013/01/good-enough-volumetrics-for-spotlights.html

Особенно,

Края ... нужно как-то смягчить, и этоs, где входят нормали вершин. Мы можем использовать точечное произведение нормали пространства представления (cnorm) с вектором представления (нормализованная позиция фрагмента, cpos) в качестве метрики, описывающей, как близко к краю ... текущий фрагмент является.

Кто-нибудь знает код для вычисления нормального пространства просмотра и вектора обзора?

Ответы на вопрос(1)

Ваш ответ на вопрос