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

Ogre Discussion :

Rendu sur texture, sans création de la fenêtre écran. OFF-SCREEN ONLY


Sujet :

Ogre

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Rendu sur texture, sans création de la fenêtre écran. OFF-SCREEN ONLY
    Bonjour,

    Je souhaiterai faire un rendu off-screen, donc rendre la scène dans une texture. Jusque là ça va, le principe n'est pas trop compliqué.
    Par contre, je veut faire du rendu off-screen only, donc sans aucune fenêtre de rendu écran.
    Vous allé me dire: "ça sert à rien un moteur graphique de rendu 3D si on affiche rien" , et bien si, mon but est d'intégrer le moteur ogre3D dans une application aillant déjà son propre moteur de rendu 2D. Et le lien entre Ogre et l'application existante se fera via des textures.

    Déjà dans un premier temps je ne fait plus le Initialise(True); qui créé automatiquement la fenêtre de rendu écran.
    Ensuite je me suis inspiré de la création manuel d'une fenêtre, pour faire la même chose avec une texture.
    Je m'explique, une fenêtre est de type RenderWindow qui hérite de RenderTarget, et une texture de rendue est de type RenderTexture qui hérite aussi de RenderTarget. Donc logiquement on doit pouvoir remplacé une fenêtre par une texture... (En rajoutant les méthodes adéquates bien sur !)
    J'ai donc ajouté une méthode, CreateRenderTexture dans ogreGLRenderSystem (en m'inspirant de CreateRenderWindow) mais sans résultat pour le moment.

    Est-on obligé de créer une RenderWindow pour que Ogre fonctionne ? On peut peut être la rendre invisible, sans la détruire, si elle est obligatoire ....


    Merci pour votre aide.

  2. #2
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Bon déjà j'ai compris pourquoi ma tentative de solution ne marche pas. Pour créer une RenderTarget de type RenderTexture il faut que le contexte OpenGL soit créé. Et pour créer le contexte OpenGL (via la fonction GLRenderSystem::initGL(RenderTarget *primary) ) il faut avoir créé un RenderTarget.
    Le problème ne se pose pas pour une fenêtre, car pour créer un RenderTarget de type RenderWindow on a pas besoin du contexte OpenGL.

    Quelqu'un a une idée ?

  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Ca y est, j'ai trouvé une alternative satisfaisante , mais qui nécessite quant même de modifier les sources au niveau de GLRenderSystem.

    Alors, en fait je conserve la phase d'initialisation du contexte OpenGL / Fenêtre grâce à la méthode initialise(true);
    L'initialisation et le paramétrage de la fenêtre se fait avec la méthode Win32Window::create, dans cette méthode on trouve la fonction suivante propre à Windows qui va réellement créer la fenêtre :

    mHWnd = CreateWindowEx(dwStyleEx, "OgreGLWindow", title.c_str(), dwStyle, mLeft, mTop, outerw, outerh, parent, 0, hInst, this);

    L'option qui m'intéresse c'est "dwStyle", elle définie les propriété de la fenêtre.
    Un peu plus haut dans le code on trouve :

    DWORD dwStyle = WS_VISIBLE | WS_CLIPCHILDREN;

    Il suffit juste de supprimer WS_VISIBLE pour que la fenêtre reste cachée, elle n'apparaît même pas dans la barre des taches, le top !!!


    PS: Je n'ai pas fait le teste pour Direct3D, mais la motif doit être du même style, supprimer WS_VISIBLE dans D3D9RenderWindow.

  4. #4
    Membre confirmé
    Avatar de gusgus
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 500
    Points : 641
    Points
    641
    Par défaut
    Sinon,plutot que de modifier les sources de Ogre,tu peu directement créer une fenetre toi meme

  5. #5
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Merci gusgus,
    effectivement avec l'option "externalWindowHandle" on peut passer un handle, j'ai pas encore testé, je regarderais ça plus tard, pour l'instant j'essaie d'avancer sur la suite de mon projet.

    Sinon il me reste un problème de performance. J'ai créé une nouvelle méthode dans RenderTexture pour faire une recopie de ma texture dans un "Buffer de pixel".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Ogre::uchar* RenderTexture::writeContentsToPBuffer (void)
      {
      //Set pBuffer size
      size_t size = mWidth * mHeight * 4;
     
      // Allocate buffer 
      uchar* pBuffer = new uchar[size];
     
      // Read pixels
      mBuffer->blitToMemory( Box(0,0,mZOffset,mWidth,mHeight,mZOffset+1), PixelBox(mWidth, mHeight, 1, PF_BYTE_RGBA, pBuffer));
     
      return pBuffer;
     }

    Comme ça je peut "lire" ce buffer depuis mon application mère, qui elle va faire le rendu écran. Et là je tombe a 40 fps pour une scène de base.... (avec une texture de 512*512 seulement !!!). Existe t'il une méthode moins couteuse en temps de calcul ?

    Ensuite je fait toujours le renderOneFrame() pour faire le rendu sur texture.
    Mais peut etre que la méthode RTT->update() serai plus approprié, mais sans le renderOneFrame() je suis pas sur que tout le rendu soit correctement fait ?
    J'ai fait quelques essais mais sans résultats.

Discussions similaires

  1. Création d'une Fenêtre pour afficher un rendu Raytracer.
    Par vmfa-2 sven dans le forum API graphiques
    Réponses: 3
    Dernier message: 03/06/2008, 15h47
  2. Réponses: 10
    Dernier message: 15/04/2008, 15h26
  3. rendu sur texture et anti aliasing
    Par J&B dans le forum DirectX
    Réponses: 3
    Dernier message: 05/05/2006, 06h54
  4. Réponses: 10
    Dernier message: 13/04/2006, 15h54
  5. Réponses: 1
    Dernier message: 06/04/2006, 17h04

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