Forums Développement Multimédia

Aller au contenu

z-buffer stage3D

CODE Actionscript

5 réponses à ce sujet

#1 inial.ludovic

    Ceinture Jaune

  • Members
  • PipPip
  • 21 messages

Posté 05 June 2012 - 17:21 PM

Bonjour,

Je cherche un moyen d'avoir l'image z-buffer d'une scene 3D en flash

Image IPB

J'ai essayé avec Alternativa3D 8 qui utilise stage3D mais je n'ai pas réussi a avoir le z de chaque pixel.
Pour le moment le meilleur résultat que j'ai réussi à avoir est en jouant avec des lumières et des objets en blanc, mais il persiste encore quelques problèmes.

J'ai vu quelqu'un qui a essayé avec Alternativa3D 7 mais le resultat est très lent et les pixel sont énorme.
Voir ici http://forum.alterna...3861.page#59848

Je voulais savoir si quelqu'un avait réussi à avoir cette image de différence de noir et blanc en utilsant stage3D qui normalement utilise un z-buffer.

Loudo

#2 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 05 June 2012 - 17:44 PM

Hello !
Ca ne parait pas très compliqué, essaye ce code là

//Au niveau du vertex shader

//on applique la transformation matricielle
"m44 vt0, va0, vc0 \n"+
//on définit les valeurs de sortie du vexter (OP)
// avec notre vertex tranformé
"mov op, vt0 \n"+                  
//on normalise le vertex, pour avoir des valeur comprise entre 0 et 1
"nrm vt0,vt0 \n"+
//on créé une variable qui va stocké en x/y/z la position z normalisée
"mov vt1.xyz,vt0.zzz \n"+
//enfin on passe cette variable au fragmentShader via V0
"mov v0, vt1 \n"
 

au niveau du fragmentShader

//V0 contient notre couleur basé sur la position z
//on l'applique en tant que couleur de sortie (OC)
"mov oc, v0"
 


Je n'ai pas essayé, mais je pense que ca devrait marcher :)

#3 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 05 June 2012 - 17:46 PM

Je ne sais pas pourquoi, je n'arrive pas à éditer mon post, mais voilà à quoi correspondent les variables utilisées dans le code

//VA0 -> les positions XYZ
//VC0 -> une matrix3D

#4 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 05 June 2012 - 19:22 PM

Tu l'auras compris, mon code correspond à la création d'un shader.
Dans ce cas, il est vraiment pertinent d'utiliser un shader car un shader sert à coder un effet graphique en fonction de la position des vertices, et c'est exactement ce qu'on veut faire :)

Mais surtout, puisque ce code est executé par la carte graphique, il ne prend casiment pas de ressources et il est appliqué pixel par pixel (donc dans la meilleure qualité possible ).

Faire la même chose en AS3 dans la même qualité prendrait plusieurs (dizaine de) secondes par rendu (d'ou le rendu lent et moche sur le lien que tu cites plus haut)

#5 inial.ludovic

    Ceinture Jaune

  • Members
  • PipPip
  • 21 messages

Posté 11 June 2012 - 11:18 AM

Merci pour ta réponse rapide,

Je n'avais pas pensé au shader. Je vais me pencher dessus dès que l'on me le permet, mais je t'avouerai que mes compétences en matrices restent limitées.
Quand j'en ai plus, je reviens.

#6 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 29 June 2012 - 21:52 PM

Pour l'instant le seul moyen d'avoir le z-buffer c'est de faire une pre-pass qui écrit la pronfondeur dans une texture et de lire ensuite cette texture dans les passes suivantes qui ont besoin de la profondeur. Avec Minko ça donne ça :


public class DepthShader extends Shader
{
  private var _depth : SFloat;

  public function DepthShader(renderTarget : RenderTarget = null, priority : Number = 0.)
  {
        super(renderTarget, priority);
  }

  override protected function getVertexPosition() : SFloat
  {
        var screenPosition : SFloat = localToScreen(vertexXYZ);

   _depth = screenPosition.z;

        return screenPosition;
  }

  override protected function getPixelColor() : SFloat
  {
        return pack(interpolate(_depth));
  }
}
 

Une fois qu'on a le shader qui écrit la profondeur, faut être sur que cette passe sera utilisée par les meshes censés se rendre dans la map de profondeur :


var depthMap : RenderTarget = new RenderTarget(new TextureResource(512, 512));

var cube : Mesh = new Mesh(
  CubeGeometry.cubeGeometry,
  { diffuseColor : 0xffffffff },
  new Effect(
        new DepthShader(depthMap, 1.0),
        new BasicShader()
  )
);
 

Ce code crée la depth map et s'assure que le mesh du cube est rendu avec un effet qui a deux passes : la passe du DepthShader puis le BasicShader (qui s'occupera de dessiner dans le back buffer). Ensuite le mieux c'est évidemment qu'au lieu du BasicShader, tu en utilises un qui utilises la depthMap, mais là il me faudrait en dire plus sur ce que tu veux faire du Z :)

Tu peux en apprendre plus sur le rendu multi-pass et le Render To Texture (RTT) en regardant l'exemple correspondant dans minko-examples :

https://github.com/a...xtureExample.as
http://blogs.aerys.i...d-with-minko-2/

Modifié par Jean-Marc Le Roux, 29 June 2012 - 21:55 PM.




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

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