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

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

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

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

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

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

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

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

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

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

[Обновить]

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

В частности,

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

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

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

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