Forums Développement Multimédia

Aller au contenu

- - - - -

Activer la normal map dans Globe Demo

... et coder le shader CODE Actionscript

6 réponses à ce sujet

#1 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 03 April 2012 - 11:28 AM

Hello !

Bon ça fait un moment que je bataille avec Minko, et petit à petit je comprend de mieux en mieux.
Apprendre l'agal et sa logique m'a pas mal aidé.

J'ai vu que dans la démo Globe il y avait une normal map qui va avec le mesh Earth si je ne m'abuse.
J'ai donc ajouté cette map au chargement, lui ai donné un nom de style en suivant d'autre threads, et ai normalement cette map de dispo dans mon shader (effect.EarthShader):

var uv                       : SValue    = interpolate(vertexUV);
var diffuseMaterial    : SValue    = sampleTexture(BumpMapStyling.DIFFUSE_MAP_ID, uv);
var diffuse                 : SValue     = diffuseMaterial.rgb;
var bump                   : SValue;

if(BUMP){
bump   = sampleTexture(BumpMapStyling.BUMP_MAP_ID, uv);
var vertexNormal : SValue = normalize(interpolate(vertexNormal));
}
 

Je n'ai aucune erreur au runtime donc les données sont bien accessibles je suppose.

Et c'est là que tout se corse ! Je crois que je vais devoir tout coder à la main si je veux un peu de reflief sur cette belle terre ...
Là encore, de la théorie s'impose! A froid je dirai que j'ai besoin de faire des calculs avec ma BumpMap, la caméra et la lumière ... mais je sais pas trop par ou commencer.

Est-ce que tu connais des articles qui expliquent bien la théorie de la chose? Les articles avec lesquels tu as toi même appris par exemple? Ou alors je vais peut être chercher trop loin?

D'avance merci.

#2 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 03 April 2012 - 11:52 AM

Je crois que je dois modifier la normale des vertex dans le vertexShader, et m'arranger pour que la lumière entre en compte dans le fragmentShader ... vrai ?

#3 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 03 April 2012 - 15:48 PM

Salut,

tu peux trouver un bon article ici:

http://fabiensanglar...pping/index.php

a+

PS : dans Minko 2, il y'a un NormalMappingShaderPart :P

#4 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 03 April 2012 - 16:12 PM

Ha ! Je vais peut être attendre alors ... à quand la sortie ?

#5 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 03 April 2012 - 18:51 PM

En fait c'est pas si dur à implémenter.
Par contre les calculs d'éclairage doivent être faits en tangent space (l'espace tangent à chaque polygone).
Minko fait déjà les calculs de la matrice TBN et fournit la tangente et la normale.
La bi-tangente peut-être calculée dans le vertex shader avec un cross product.

En gros, pour passer de local à tangent space, ça donne ça:


public function localToTangentSpace(value : SValue) : SValue
{
  var vertexBiTangent : SValue = cross(vertexNormal, vertexNormal);


  return float3(
    dotProduct3(value, vertexNormal),
    dotProduct3(value, vertexBiTangent),
    dotProduct3(value, vertexTangent)
  );
}
 

N'hésite pas à faire des méthodes dans tes shaders et à les appeler. Tu peux y aller à fond ça n'a aucun impact sur le code généré en sortie. Même si tu fais des petites erreurs et que t'appelles la même fonction plusieurs fois pour rien, le compilo s'occupera de refactorer le tout pour que les opérations ne soient faites qu'une fois :)

Sur Aerys Answers quelqu'un a déjà posté du code pour le faire :

"Manual material definition with diffuse, normal and specular maps" sur Aerys Answers

Je l'avais implémenté avec le ShaderLab aussi c'est pas très dur.

Par contre n'oublie pas de mettre un TangentSpaceModifier par dessus tes meshes... Dans Minko 2 c'est mieux foutu : si tu utilises vertexNormal ou vertexTangent dans tes shaders, le mesh "sait" qu'il doit calculer les normales/tangentes si il ne les a pas a sa disposition. Du coup plus de modifiers à ajouter ça le fait tout seule. Par contre tu peux toujours coder un controller qui intervient sur le mesh et ajoute des données, comme les modifiers le font actuellement :)

Modifié par Jean-Marc Le Roux, 03 April 2012 - 18:51 PM.


#6 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 07 May 2012 - 09:57 AM

Me voici de retour ici ...

Je me repenche sur le calcul de tangente, via l'article que tu m'a passé: http://fabiensanglar...pping/index.php
Et je me demandais si la fonction présentée ici était valable pour le calcul? je suppose que le style text2 représente une texture un, et float3 ici représente un vecteur. Pourquoi on a besoin de deux de chaque d'ailleur? Merci !
        generateNormalAndTangent(float3 v1, float3 v2, text2 st1, text2 st2)
        {
                float3 normal = v1.crossProduct(v2);
               
                float coef = 1/ (st1.u * st2.v - st2.u * st1.v);
                float3 tangent;

                tangent.x = coef * ((v1.x * st2.v)  + (v2.x * -st1.v));
                tangent.y = coef * ((v1.y * st2.v)  + (v2.y * -st1.v));
                tangent.z = coef * ((v1.z * st2.v)  + (v2.z * -st1.v));
               
                float3 binormal = normal.crossProduct(tangent);
        }


#7 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 08 May 2012 - 22:04 PM

Dans ce code, v1 et v2 sont à priori des arrête d'un triangle.
En faisant le cross product de deux vecteurs d'un plan, on obtient la normale.
Le reste est du même genre.

Ce qu'il est important de comprendre c'est que cette fonction sert juste à calculer la normale, la tangente et la bi-tangente si elles n'existent pas. C'est fait sur le CPU. Dans Minko, ce qu'il se passe c'est :

- on utilise n'importe quel VertexComponent dans son shader
- le compilateur va sortir une table d'allocation indiquant comment les buffers de vertices devront être mis en place pour dessiner
- lorsque l'Effect est associé au Mesh, le RenderingController va se charger de créer les DrawCall pour chaque passe (Shader), ce qui implique qu'il va prendre les VertexStream présents dans Mesh.geometry et les "mettre en ordre" en fonction de la table d'allocation précédemment citée pour être sûr que le shader aura bien ce qu'il attend en entrée pour chaque vertex
- si le Shader fait appelle à un VertexComponent qui n'existe pas dans le format des VertexStreams, alors on va essayer de le calculer quand on le peut. Par exemple, on peut calculer les normales ou les tangentes. Pour les autres VertexComponent, il y'aura une erreur.

Les deux liens ci-dessus sont l'équivalent du code que tu as posté. La seule différence c'est qu'on fait le calcule par vertex par ce que c'est ce dont à vraiment besoin le shader.

Ensuite dans le Shader justement, on se sert de la tangente et de la normale pour calculer la bi-tangente. Avec ces 3 trucs, on a la matrice TBN qui permet de passer de l'espace local à l'espace tangentiel : l'espace en repère "triangle". C'est dans cet espace que les normales de la "normal map" sont calculées.

A partir de là, on fait passer toutes les valeurs (direction de la lumière, position de la caméra, etc...) en "tangent space" et ça redevient du calcul d'éclairage "classique".



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP