Forums Développement Multimédia

Aller au contenu

- - - - -

Multipass effect

multipass multipasseffect CODE Actionscript

4 réponses à ce sujet

#1 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 03 May 2012 - 17:22 PM

Hello!

J'ai repris le code que tu as donné dans les exemples: http://blogs.aerys.i...able-on-github/ et je travaille sur la classe MinkoExample03.

En m'inspirant du globe qui est déjà en exemple pour Minko, je voudrais créer une sorte de Glow autour du Teapot, ou pour commencer n'importe quoi rajoutant un effet par dessus la lumière (on véra pour les spécificité plus tard, jveux d'abord voir un résultat à l'écran :D ). J'ai donc fait ça:

var teapot : Mesh    = new Mesh(
    new TeapotGeometry(),
    { diffuseColor : 0xddddffff },
    new Effect(new DirectionalLightShader(),new GlowShader())
);

Avec:
public function GlowShader() {
   
   
}
override protected function getPixelColor() : SFloat
{
        var color : SFloat    = meshBindings.getParameter('diffuseColor', 4);
       
        return color;
}

override protected function getVertexPosition() : SFloat {
    return localToScreen(vertexXYZ);
}

override protected function initializeSettings(settings : ShaderSettings) : void {
    settings.priority = 1;
}

Mes questions sont les suivantes:
- comment je fais pour récupérer le résultat du Shader précédent au niveau de la couleur? Pour y rajouter des traitements, sans avoir à tout recalculer ou recopier du code ?
- même question pour le getVertexPosition, ce que j'ai mis fonctionne déja mais si ça se trouve c'est uniquement dans ce cas précis, et c'est peut être lourd à calculer deux fois.
- est-ce que j'ai pas plutôt intérêt a faire un seul shader, et deux shader parts ? Un peu sur le modèle du DirectionallightShaderPart et getIllumination ?

Merci :)

#2 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 04 May 2012 - 11:23 AM

Multi-pass ça veut dire que ton mesh sera rendu plusieurs fois, avec plusieurs shaders différents et éventuellement dans plusieurs textures différentes.

Pour le glow tel qu'il est utilisé dans la démo Google Globe on fait deux passes :
- la première, avec un culling "inversé", va dessiner le glow sans écrire dans le z-buffer
- la deuxième va dessiner l'objet "par dessus" le glow

Donc pas besoin de récupérer les "pixels précédents".

Il y'a d'autres techniques pour le glow qui donnent de meilleurs résultats et sans les mêmes contraintes côté géométrie, mais elle demande du RTT + post-processing. C'est par exemple comme ça que c'est fait Left4Dead 1 & 2:

- une passe de RTT dessine avec la couleur du glow
- une passe de rendu dessine la géométrie
- une passe de post-process blur la texture de glow
- une passe de post-process applique la texture de glow par dessus le rendu normal en additif

Il ne faut donc pas confondre:
- multi-pass, qui veut dire qu'on rend le même objet plusieurs fois avec plusieurs techniques et dans différentes textures
- post-processing, qui veut dire qu'on applique un effet sur les pixels déjà calculés et stockés dans une texture
- shader parts, qui ne sont qu'un moyen élégant de partager des fonctions (et non pas des pixels) entre plusieurs shaders

Concernant ton code, ton glow shader fait un rendu tout à fait classique en utilisant la diffuseColor du mesh.
Ce que tu devrais plutôt faire, c'est étirer le vertex le long de la normale avant de le passer en screen space:


protected function getVertexPosition() : SFloat
{
  var viewPos : SFloat = localToView(vertexXYZ);

  viewPos.incrementBy(multiply(.5, vertexNormal.xyz));

  return multiply(viewPos, projectionMatrix);
}
 

J'espère que ça t'aide !

#3 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 04 May 2012 - 13:51 PM

Donc si j'ai bien saisi:


- une passe de RTT dessine avec la couleur du glow
Je dessine mon objet avec une couleur unie, par exemple du blanc, sans ombre sans rien, du blanc partout.
- une passe de rendu dessine la géométrie
Un rendu normal comme si je voulais rendre mon objet pour affichage classique
- une passe de post-process blur la texture de glow
On peut faire du post-process sur des objets spéficiques? dans ma tête c'était juste un traitement d'image final
- une passe de post-process applique la texture de glow par dessus le rendu normal en additif
ici j'ai donc normalement un objet rendu normalement, et la forme de l'objet en blanc et blur, mais je saisi pas trop ...

Encore merci :)

#4 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 08 May 2012 - 22:07 PM

En fait la technique que tu reprends c'est la 2. J'ai oublié un détail important : elle requiert l'utilisation du stencil buffer pour éviter que la texture de glow ne recouvre entièrement l'objet rendu "normalement". Et la gestion du stencil buffer, c'est quelque chose qu'on a pas encore fini d'implémenter.

Donc pour l'instant tu devrais déjà commencé par la technique 1, qui est plus simple : pas de RTT, pas de stencil buffer, pas de post process.

#5 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 30 May 2012 - 12:37 PM

A noter que l'ajout récent de la gestion du stencil buffer par un contributeur permet maintenant - à priori - d'implémenter la technique de glow utiliser dans Left4Dead:

https://developer.va...L4D_Glow_Effect



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

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