IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Implémentation des PSSM


Sujet :

OpenGL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Implémentation des PSSM
    Bonjour,

    Cela fait déjà quelques jours que je bloque dessus et pas moyen de trouver une solution, j'ai cherché partout. Je suis désespéré.
    J'ai lu l'article de Nvidia sur les PSSM et je n'arrive pas à faire la partie "Scene-Dependent Projection", a priori la "Scene-Independent Projection" se passe sans soucis mais c'est peut-être une coïncidence.

    En gros mon ombre est "bien" sans la matrice Crop :
    Nom : javaw 2014-10-13 13-41-44-07.png
Affichages : 266
Taille : 702,6 Ko

    et avec c'est le bazar...
    Nom : javaw 2014-10-13 13-42-18-39.png
Affichages : 256
Taille : 647,2 Ko

    Je vous passe ma méthode calcCropMatrix (attention c'est du java ^^) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    public void calcCropMatrix(ArrayList<OBJMesh> shadowReceivers)
    	{
     
    		// Merge all bounding boxes of casters into a bigger "casterBB".
    		BoundingBox casterBB = new BoundingBox();
    		for(int i = 0; i < _shadowCasters.size(); i++) {
    			BoundingBox bb = BoundingBox.mulByMatrix4f(_shadowCasters.get(i).getAABB(), _MVP);
    		    casterBB.union(bb);
    		}
     
    		// Merge all bounding boxes of receivers into a bigger "receiverBB".
    		BoundingBox receiverBB = new BoundingBox();
    		for(int i = 0; i < shadowReceivers.size(); i++) {
    			BoundingBox bb = BoundingBox.mulByMatrix4f(shadowReceivers.get(i).getAABB(), _MVP);
    			receiverBB.union(bb);
    		}
     
    		// Find the bounding box of the current split  
    		// in the light's clip space.  
     
    		// transf = bounds dans light's clip space
     
    		Vector4f transf = _MVP.mulVector4f(new Vector4f(_bounds[0], 1));
    		Vector3f transf3 = new Vector3f(transf.x() / transf.w(), transf.y() / transf.w(), transf.z() / transf.w());
    		BoundingBox splitBB = new BoundingBox(transf3, transf3); // init crop BB avec le premier bound
    		for(Vector3f bound : _bounds) {
    			transf = _MVP.mulVector4f(new Vector4f(bound, 1));
     
    			transf3 = new Vector3f(transf.x() / transf.w(), transf.y() / transf.w(), transf.z() / transf.w());
     
    			if(transf3.x() > splitBB.max.x()) splitBB.max.x(transf3.x());
    			if(transf3.x() < splitBB.min.x()) splitBB.min.x(transf3.x());
    			if(transf3.y() > splitBB.max.y()) splitBB.max.y(transf3.y());
    			if(transf3.y() < splitBB.min.y()) splitBB.min.y(transf3.y());
    			if(transf3.z() > splitBB.max.z()) splitBB.max.z(transf3.z());
    			if(transf3.z() < splitBB.min.z()) splitBB.min.z(transf3.z());
    		}
     
     
    		BoundingBox cropBB = new BoundingBox();
     
    		cropBB.min.x( Math.max(Math.max(casterBB.min.x(), receiverBB.min.x()), splitBB.min.x()) );
    		cropBB.max.x( Math.min(Math.min(casterBB.max.x(), receiverBB.max.x()), splitBB.max.x()) );
    		cropBB.min.y( Math.max(Math.max(casterBB.min.y(), receiverBB.min.y()), splitBB.min.y()) );
    		cropBB.max.y( Math.min(Math.min(casterBB.max.y(), receiverBB.max.y()), splitBB.max.y()) );
    		cropBB.min.z( Math.min(casterBB.min.z(), splitBB.min.z()) );  
    		cropBB.max.z( Math.min(receiverBB.max.z(), splitBB.max.z()) );
     
    		//cropBB = splitBB;
    		//cropBB.min.z(0);
    		//System.out.println(cropBB);
     
    		// Nous avons notre cropBB, calcul de la matrice crop
    		float scaleX, scaleY, scaleZ;
    		float offsetX, offsetY, offsetZ;
    		scaleX = 2.0f / (cropBB.max.x() - cropBB.min.x());  
    		scaleY = 2.0f / (cropBB.max.y() - cropBB.min.y());  
    		offsetX = -0.5f * (cropBB.max.x() + cropBB.min.x()) * scaleX;  
    		offsetY = -0.5f * (cropBB.max.y() + cropBB.min.y()) * scaleY;  
    		scaleZ = 1.0f / (cropBB.max.z() - cropBB.min.z());  
    		offsetZ = -cropBB.min.z() * scaleZ;  
    		_crop.identity();
    		_crop.set(0, 0, scaleX);
    		_crop.set(1, 1, scaleY);
    		_crop.set(2, 2, scaleZ);
    		_crop.set(3, 0, offsetX);
    		_crop.set(3, 1, offsetY);
    		_crop.set(3, 2, offsetZ);
     
    		_MVPC = _crop.clone().mul(_MVP);
    		_MVPCB = _MVPC.toBias();
    	}
    Ma méthode statique BoundingBox.mulByMatrix4f qui peut aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    public static BoundingBox mulByMatrix4f(BoundingBox aabb, Matrix4f m)
    	{
     
    		Vector4f transf = m.mulVector4f(new Vector4f(aabb.min, 1));
    		Vector3f transf3 = new Vector3f(transf.x() / transf.w(), transf.y() / transf.w(), transf.z() / transf.w());
    		BoundingBox bb = new BoundingBox(transf3, transf3); // init avec le premier vertex
     
    		transf = m.mulVector4f(new Vector4f(aabb.max.x(), aabb.min.y(), aabb.min.z(), 1));
    		transf3 = new Vector3f(transf.x() / transf.w(), transf.y() / transf.w(), transf.z() / transf.w());
    		compareBB(transf3, bb);
    		transf = m.mulVector4f(new Vector4f(aabb.min.x(), aabb.max.y(), aabb.min.z(), 1));
    		transf3 = new Vector3f(transf.x() / transf.w(), transf.y() / transf.w(), transf.z() / transf.w());
    		compareBB(transf3, bb);
    		transf = m.mulVector4f(new Vector4f(aabb.max.x(), aabb.max.y(), aabb.min.z(), 1));
    		transf3 = new Vector3f(transf.x() / transf.w(), transf.y() / transf.w(), transf.z() / transf.w());
    		compareBB(transf3, bb);
     
    		transf = m.mulVector4f(new Vector4f(aabb.min.x(), aabb.min.y(), aabb.max.z(), 1));
    		transf3 = new Vector3f(transf.x() / transf.w(), transf.y() / transf.w(), transf.z() / transf.w());
    		compareBB(transf3, bb);
    		transf = m.mulVector4f(new Vector4f(aabb.max.x(), aabb.min.y(), aabb.max.z(), 1));
    		transf3 = new Vector3f(transf.x() / transf.w(), transf.y() / transf.w(), transf.z() / transf.w());
    		compareBB(transf3, bb);
    		transf = m.mulVector4f(new Vector4f(aabb.min.x(), aabb.max.y(), aabb.max.z(), 1));
    		transf3 = new Vector3f(transf.x() / transf.w(), transf.y() / transf.w(), transf.z() / transf.w());
    		compareBB(transf3, bb);
    		transf = m.mulVector4f(new Vector4f(aabb.max.x(), aabb.max.y(), aabb.max.z(), 1));
    		transf3 = new Vector3f(transf.x() / transf.w(), transf.y() / transf.w(), transf.z() / transf.w());
    		compareBB(transf3, bb);
     
     
    		return bb;
    	}
    	private static void compareBB(Vector3f transf, BoundingBox bb)
    	{
    		if(transf.x() > bb.max.x()) bb.max.x(transf.x());
    		if(transf.x() < bb.min.x()) bb.min.x(transf.x());
    		if(transf.y() > bb.max.y()) bb.max.y(transf.y());
    		if(transf.y() < bb.min.y()) bb.min.y(transf.y());
    		if(transf.z() > bb.max.z()) bb.max.z(transf.z());
    		if(transf.z() < bb.min.z()) bb.min.z(transf.z());
    	}
    Merci d'avance pour votre aide.

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Hum, comment dire, j'ai pas dû chercher très loin vu que j'ai essayé un truc con mais qui apparemment était implicite dans l'article de Nvidia.
    De passer non pas la MVP au shader du FrameBuffer mais bien la MVPC (donc avec la Crop Matrix). J'ai pensé à ça vu qu'en faite la définition même de la Crop Matrix c'est une précision pour la Projection Matrix donc elles vont ensemble.

    La qualité est nettement meilleure sauf qu'on pourrait faire mieux en supprimant le terrain (qui là fait partie du groupe de mesh) des shadow casters.

    De plus, faut-il faire une méthode qui permet de sélectionner les "bons" shadow casters et receivers, j'entends par là que pour l'instant ça prend tous les meshs de la scène et non ceux qui sont uniquement visibles dans le frustum. De plus, est-il judicieux de prendre en compte les shadow casters qui ne sont pas à l'écran mais qui sont sucseptibles de faire une ombre à l'écran (donc savoir si le bout de leur ombre est dans le frustum ou non : calculer la taille de l'ombre etc.) ?

    Nom : javaw 2014-10-13 16-44-02-36.png
Affichages : 263
Taille : 600,9 Ko

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Points : 968
    Points
    968
    Par défaut
    Tu n'as pas a sélectionner les 'bons' et 'mauvais' shadow casters. Tous les casters sont bons, et décider si quelque chose est un caster ou pas est presque plutôt un problème d'artiste que de programmeur. En gros, dans ta scène, tout est un caster a part le sol. Normalement, meme si la bounding box des casters est plus large que celle du frustum, comme tu fais une intersection des deux, tu te retrouves avec le plus petit volume, donc presque tous les objets qui contribuent. Je dis 'presque' parce que le problème que tu peux avoir, c'est que les objets hors de split frustums puissent être ignorés: si ton soleil est derrière toi, et que tu as un objet aussi derrière, il ne sera pas rendu, vu que c'est hors de l'intersection de casters/view . La solution pour ça est toute simple, comme les bounding boxes sont calculées dans l'espace 'lumière' (donc vues par ton soleil), il suffit de forcer le minZ de ta bounding box finale a 0 pour que le rendu se fasse depuis la lumière jusqu'au coté le plus éloigné de ta box.
    C'est assez difficile a expliquer sans diagrammes, tout ça, mais en gros, décommentes ton cropBB.min.z(0) et ça devrait être bon.

    Aussi, petite optimisation gratuite: si ta box d'intersection view/casters est vide, pas besoin de faire de rendu. Ça peut arriver si tu as une camera très loin de tout caster.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse.

    Quand tu parles d'intersection des BB tu parles de ce passage ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cropBB.min.x( Math.max(Math.max(casterBB.min.x(), receiverBB.min.x()), splitBB.min.x()) );
    cropBB.max.x( Math.min(Math.min(casterBB.max.x(), receiverBB.max.x()), splitBB.max.x()) );
    cropBB.min.y( Math.max(Math.max(casterBB.min.y(), receiverBB.min.y()), splitBB.min.y()) );
    cropBB.max.y( Math.min(Math.min(casterBB.max.y(), receiverBB.max.y()), splitBB.max.y()) );
    cropBB.min.z( Math.min(casterBB.min.z(), splitBB.min.z()) );  
    cropBB.max.z( Math.min(receiverBB.max.z(), splitBB.max.z()) );
    Ou d'une coupe ?

    Sinon là, j'ai un méga problème avec ma matrice "model", quand je veux faire une rotation sur mes meshs ça déconne au niveau ombre. Quand doit intervenir la matrice model ? (dans les 2 passes)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Rien à voir mais t'as pas fait des études à Arles par hasard??

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Non pas du tout.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/08/2006, 18h15
  2. Réponses: 1
    Dernier message: 26/06/2006, 12h33
  3. implémentation des opérateurs de comparaison
    Par niko8181 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 28/04/2005, 12h58
  4. Implémentation des objets en mémoire
    Par SteelBox dans le forum C++
    Réponses: 6
    Dernier message: 15/01/2005, 22h38
  5. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 17h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo