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

Moteurs 3D Discussion :

[OpenGL] Moteur 2.5D a la Alone in the Dark 4


Sujet :

Moteurs 3D

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 6
    Points
    6
    Par défaut [OpenGL] Moteur 2.5D a la Alone in the Dark 4
    Bonjour a tous !

    Voila quelques jours qu'avec un camarade de dev nous planchons sur un moteur a la Alone in the dark 4 (décors en 3D préca, persos en 3D, gestion dynamique des lumières), et nous bloquons bêtement sur la gestion des lumières.

    Sur le papier, le principe est simple: nous avons a chaque fois 2 version d'un même décor, une version sombre et une version illuminée. On intègre a notre scène 3D très simplifiée un spot, qui va se projeter dans cette dernière afin d'obtenir un masque en dégradé de gris, ayant pour but de savoir quelles parties de la pièce sont éclairées.
    Là les choses se gâtent. Jusqu'ici pas de problème, tout marche a merveille. Nous nous retrouvons donc avec nos deux images préca, et notre buffer qui contient un masque noir et blanc.

    L'idée est d'afficher la première image (sombre), puis d'utiliser le masque pour afficher par dessus une version découpée de la seconde image.

    Voila maintenant plusieurs heures que nous cherchons désespérément un moyen de faire ça, sans succès. Nous torturons dans tous les sens la methode glBlendFunc(), mais rien n'y fait, aucun résultat correct jusqu'ici.

    En bref, nous avons besoin de reproduire le principe tout bête d'un masque de fusion. Actuellement, quand on fusionne la seconde image et le masque via glBlendFunc(), on obtiens bien notre découpage, mais sur fond noir, pas sur fond transparent.

    Le code utilisé est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #CODE RUBY
     
    image1.draw(0, 0, 640, 480)
     
    glEnable(GL_BLEND)
    mask.draw(0, 0, 640, 480)
    glBlendFunc(GL_DST_ALPHA, GL_ZERO)
    image2.draw(0, 0, 640, 480)
    glDisable(GL_BLEND)
    Si quelqu'un a la solution a notre problème, par pitié, qu'il fasse signe !

    Merci d'avance

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Bon, j'ai du nouveau, j'ai réussi a faire a moitié ce que je voulais.
    Je suis parti de l'idée suivante:

    Si j'utilise mon masque via les valeurs noir et blanc, et que je l'utilise sur mes deux images (pour la première image, on affiche les parties blanches du masque, et pour la seconde les parties noires), et qu'ensuite, je fusionne ces deux résultats en additif, tout devrait marcher.

    Sur le papier, oui. Mes blends fonctionnent bien, j'ai bien mon image1 découpée, mon image2 découpée a l'inverse. Mais les choses se gatent quand je souhaite les fusionner.


    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
     
    #CODE RUBY
     
    #Masquage de la première image
     
    glEnable(GL_BLEND)    
    @image1.draw(0, 0, 640, 480)
    glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR)
    @mask.draw(0, 0, 640, 480)
     
    #Blend des deux images masquées
     
    glBlendFunc(GL_ONE, GL_ONE)
     
     
    #masquage de la seconde image
     
    @image2.draw(0, 0, 640, 480)    
    glBlendFunc(GL_ZERO, GL_SRC_COLOR)
    @mask.draw(0, 0, 640, 480)
    glDisable(GL_BLEND)
    Mon souci est qu'ici, toutes les étapes de blend se font successivement, alors que j'aimerai faire séparément le blend de mes 2 images et du masque, pour ensuite blender le résultat des deux.

    Voici un schema pour rendre tout ça plus clair:

    Voila ce que je souhaite faire


    Comme les images de la seconde étapes sont des blends entre une image et un masque, je ne sais pas comment effectuer la dernière étape de fusion...

    J'imagine qu'il y a une solution a ça, mais pour le moment, mes recherches font chou blanc

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 60
    Points : 74
    Points
    74
    Par défaut yop
    peut être qu'avec un render to texture,,,ça ne doit pas être la meilleure solution mais bon....tu pourrai blender tes 2 résultat de masquage

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Malheureusement, nous avons essayé cette technique, mais elle s'avère bien trop gourmande en terme de perfs...

    N'y a-t-il pas un moyen de cumuler les blends, sans passer par un render to texture ?

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 60
    Points : 74
    Points
    74
    Par défaut yop
    tu pourrai utiliser une librairie de traitement d image, mais la c est le CPU qui va morfler

  6. #6
    Membre régulier Avatar de Froyok
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 83
    Points : 73
    Points
    73
    Par défaut
    Bonjour jeewee !
    J'avoue être perplexe :



    Voilà pour le masque.
    Ensuite, pour réaliser cela, rien de plus simple (selon moi) : utilise deux texture qui se chevauche, toute deux ayant la taille de ta fenêtre de rendu.

    Et par dessus tout ça, tu affiches le personnage.
    Ensuite pour calculer les zones éclairée, pourquoi ne pas simuler une sorte de "scène" physique non affiché, mais dont le but sera de permettre le calcul des rayons et zones éclairées ? (J'espère avoir été clair... )

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    J'applique le masque sur les deux images de manière a pouvoir les superposer bêtement en additif.
    Le rendu du premier masquage ne donne pas un calque avec transparence, mais bien une image sur fond noir (d'où le choix de passer par de l'additif pour superposer les deux résultats).

    Pour faire ce que tu propose, il faudrait utiliser les infos de noir et blanc pour écrire dans la couche alpha de l'image, seule la méthode GlBlendFuncSeparate permet de le faire, mais elle n'est pas gérée par les cartes graphiques relativement anciennes, et nous tenons a ce que ça tourne sur des configs modestes.

    Ce n'est pas si simple, on a cherché des tonnes de solutions, mais pour le moment rien de bien satisfaisant. On fait juste les tests de masquage a partir d'une image pour des questions de commodités.

    Pour ce qui est de la gestion des zones éclairées, c'est exactement ce qu'on fait, on dessine une scène 3D basique et une lampe, sans les afficher, et on pioche les infos dans le buffer.

Discussions similaires

  1. [Recrutement] Cherchons programmeur pour jeu "Alone in the battle "
    Par chezboris dans le forum Projets
    Réponses: 5
    Dernier message: 22/10/2011, 10h29
  2. GLest : un moteur de jeu de stratégie en OpenGL
    Par raptor70 dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 24/02/2009, 22h59
  3. Interfacer OpenGL dans un moteur 3D
    Par trecks dans le forum Moteurs 3D
    Réponses: 2
    Dernier message: 26/11/2007, 19h56
  4. bruitage wav de moteur ds animation/OpenGL / VCL
    Par LotfiB dans le forum C++Builder
    Réponses: 1
    Dernier message: 08/12/2005, 14h11
  5. Un moteur 3d sans Opengl ?
    Par AsmCode dans le forum OpenGL
    Réponses: 7
    Dernier message: 27/10/2005, 10h15

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