Forums Développement Multimédia

Aller au contenu

- - - - -

Un miroir ...

CODE Actionscript

5 réponses à ce sujet

#1 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 24 November 2011 - 11:52 AM

Hello !

Je me rappelle avoir cherche dans Away3D et Alternativa3D pendant un moment pour tout ce qui était réflexion de l'environnement. J'ai généralement rien trouve, a part la réflexion d'une sky box!

Est-ce que minko permet de realiser ce genre de choses via un reflective material? Ou alors s'agit t il des meme contraintes?

J'ai besoin de creer un miroir :)

#2 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 25 November 2011 - 02:48 AM

Voir le messagethomas.pujolle@etu.u-bordeaux3.fr, le 24 November 2011 - 11:52 AM, dit :

J'ai besoin de creer un miroir :)

C'est tout à fait possible ! Mais il va falloir apprendre à utiliser le multi-pass et le MRT (multiple render targets).
Il y'a tout ce qu'il faut dans minko pour ça.
Ce qu'il faut faire c'est créer deux passes :
- une première passe qui remplit une map de réflexion planaire
- une deuxième passe qui dessine le miroir en utilisant cette réflexion

Les objets qui sont "réfléchissables" devront avoir un effet qui :
- utilise la première passe pour être dans la map de réflexion
- utilise ensuite n'importe quelle(s) passe(s) pour se dessiner dans le back buffer

Le miroir lui, n'utilisera que la deuxième passe qui ira piocher dans la réflexion map précédemment générée.
Mais justement, comment garantir que la réflexion map est remplie avant d'être utilisée ?

Il ne faut SURTOUT PAS imaginer que cela a un rapport avec l'ordre des objets dans la scène.
L'ordre des objets dans la scène n'influence pas (et ne doit jamais influencer) l'ordre de rendu. Sinon, c'est le début des problèmes.
Au lieu de cela, on va pouvoir donner une priorité à chaque passe.
Lors du rendu, la méthode "fillRendererState" de chaque IEffectPass est appelée, donnant ainsi l'occasion de remplir le RendererState qui contient les informations relatives au rendu qui est en train d'être fait. Parmi ces informations se trouve la priorité (RendererState.priority). Une fois toute la scène parcourue, tous les RendererState générés/remplis sont triés en fonction de leur priorité. C'est par exemple grâce à cette priorité qu'on arrive à rendre les objets transparents tout à la fin.
Plus la priorité est élevée, plus le RendererState sera exécuté tôt durant le rendu. Il faut donc s'assurer que la pass de rendu de la réflexion map utilise bien une priorité plus élevée que la pass qui s'en servira lors du rendu du miroir.

Il faut également pouvoir dessiner dans une texture.
Pour cela, c'est presque aussi simple. La première étape c'est de créer la texture qui servira de cible aux opérations de rendus censées remplir la réflexion map. Ces textures sont comme toutes les autres textures (elles sont ajoutées à la scène, elles ont une propriété "styleProperty", etc...). Elles sont définies par la class RenderTargetTexture. Ici on va imaginer que notre miroir ne fait que réfléchir à 100%, donc notre RenderTargetTexture sera utilisée en tant que BasicStyle.DIFFUSE et on va juste coder un MirrorShader qui utilise les bons UVs calculés pour afficher une réflexion planaire.


var mirrorReflectionMap : RenderTargetTexture = new RenderTargetTexture(1024, 1024, 0);
var mirror : MaterialGroup = new MaterialGroup(new SinglePassEffect(new MirrorShader());

// la mirrorReflectionMap sera samplée par le MirrorShader, on va donc la ranger dans les textures de notre MaterialGroup
mirror.textures.addChild(mirrorReflectionMap);
// on ajout un quad pour faire office de miroir
mirror.addChild(QuadMesh.quadMesh);

var reflectedScene : EffectGroup = new EffectGroup(new MirrorReflectionEffect(mirrorReflectionMap.renderTarget));

reflectedScene.addChild(.... // tout ce que tu veux voir dans le miroir

scene.addChild(miror).addChild(reflectedScene);
 


// l'effet pour les objets réfléchis
public class MirrorReflectionEffect implements IEffect
{
  private var _passes : Vector.<IEffectPass> = null;

  public function MirrorReflectionEffect(mirrorReflectionTarget : RenderTarget)
  {
    _passes = new <IEffectPass>[
      // l'objet sera rendu dans la map de réflexion représentée par "mirrorReflectionTarget"
      new MirrorReflectionPass(mirrorReflectionTarget),
      // l'objet sera également rendu dans le backbuffer en utilisant le BasicEffect
      new BasicEffect()
    ];
  }

  public function getPasses(styleData : StyleData, transformData : TransformData, worldData : Dictionary) : Vector.<IEffectPass>
  {
    return _passes;
  }
}
 


// la passe qui cible la map de reflexion
public class MirrorReflectionPass extends SinglePassEffect
{
  public function MirrorReflectionPass(renderTarget : RenderTarget)
  {
    // on utilise une priorité plus élevée que celle de l'effet du miroir (à priori 0.), par exemple 10.
    // SinglePassEffect.fillRendererState s'occupera de setter "renderTarget" dans le RendererState
    super(new MirrorReflectionShader(), renderTarget, 10.);
  }
}
 

Je te laisse le soin de coder les shaders :)

Si tu veux mixer diffuse et réflexion pour ton miroir, je te conseille de regarder ici pour comprendre comment sampler les deux textures.

Quelque chose que nous allons changer dans la v2 c'est comment la liste de passes est gérée.
Ici c'est assez dur de combiner les passes de plusieurs effets. Par exemple c'est dur (mais possible) d'utiliser le LightingEffect pour le rendu dans le backbuffer fait par le MirrorReflectionEffect.

a+

#3 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 25 November 2011 - 12:25 PM

Merci pour la réponse détaillée ! :)

Je jete un oeil en détail quand j'ai le temps, je vais devoir étudier la question correctement :D

A quand d'autre tutoriels et ressources sur le site?

#4 AlexandroG

    Ceinture Blanche

  • Members
  • Pip
  • 12 messages

Posté 26 November 2011 - 23:42 PM

reflectedScene.addChild(.... // tout ce que tu veux voir dans le miroir
Why i need to add all "reflected" objects to reflectedScene? can i only define the view parameters of camera that renders to texture? how can i do this?

"... la v2 ..." - it means "Minko version v2"? - some phrases and words hard to translate for me =(

#5 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 28 November 2011 - 15:47 PM

Voir le messageAlexandroG, le 26 November 2011 - 23:42 PM, dit :

"... la v2 ..." - it means "Minko version v2"? - some phrases and words hard to translate for me =(

Yep !

#6 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 08 December 2011 - 02:10 AM

Tu arrives à t'en sortir Thomas ?

Nous avons ajouté pas mal de features dans la V2 de minko-lighting, comme les réflexions dynamiques.
Mais nous n'avons pas encore ajouté les réflexions planaires (ça ne devrait pas tarder).

Je pense que ce que tu essaies de faire est une très bonne manière d'apprendre tout plein de choses.
N'hésite pas si tu as besoin d'aide !

a+



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