Trois.js-shader code pour l'effet halo, les normales ont besoin de transformation

j'essaie de créer un shader pour produire un effet halo lumineux en trois.js. Ma tentative actuelle est en direct ici: http://stemkoski.github.io/Three.js/Shader-Halo.html

le code shader est actuellement:

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

Cela fonctionne très bien à condition de l'objet reste au centre de la scène. Après le zoom ou le panoramique, l'effet halo semble changer d'intensité ou semble déséquilibré, respectivement.

je pense que je comprends pourquoi c'est, mathématiquement -- dans ce code, l'intensité de l'effet de lueur est déterminée par la coordonnée z du vecteur normal au maillage, parce que c'est le vecteur faisant face au spectateur, et donc je devrais d'une manière ou d'une autre appliquer une transformation similaire à (0,0,1) avant de calculer l'intensité.

ainsi je suis arrivé à

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

qui semble complètement différent de mon shader original, même à l'origine, et continue de changer d'apparence alors que je zoome et arpente la scène.

je suis perdu. Quelqu'un sait comment transformer le vecteur normal correctement (ou ce que d'autres changements(s)) de sorte que l'apparence produite par ce shader ne change pas lorsque le zoom/panoramique de la scène?

[mise à Jour]

il semble y avoir une avance prometteuse à http://john-chapman-graphics.blogspot.com/2013/01/good-enough-volumetrics-for-spotlights.html

en particulier,

Les bords ... besoin d'être adoucie en quelque sorte, et c'est là que les normales des sommets venir. Nous pouvons utiliser le produit de points de l'espace de vue normal (cnorm) avec le vecteur de vue (la position normalisée des fragments, cpos) comme une métrique décrivant comment près du bord ... le fragment actuel est.

est-ce que quelqu'un connaît le code pour calculer l'espace de vue normal et le vecteur de vue?

4
demandé sur Lee Stemkoski 2013-07-03 22:41:14

1 réponses

compris!

dans mon code ci-dessus, vNormal était le vertex normal. Pour obtenir le vecteur de vue, ajoutez un uniforme au shader dont la valeur est la différence entre la position du mesh et la position de la caméra. (En théorie, la valeur devrait être la différence entre la position de chaque vertex et la position de la caméra, mais c'était assez proche pour mes besoins.)

pour une implémentation, consultez: http://stemkoski.github.io/Three.js/Shader-Glow.html

5
répondu Lee Stemkoski 2013-07-05 15:18:16