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 :

Rendu OpenGl Offscreen


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Par défaut Rendu OpenGl Offscreen
    Bonjour à tous,

    J'ai une appli C++ (wxwidgets et opengl) qui génère des images à l'écran (les tests se font sur winXP). Jusque la, aucun soucis. Mais j'ai besoin (pour des raisons d'intégration dans un serveur d'application par JNI) de créer à partir de cette appli des images non plus à l'écran, mais dans des fichiers images (pour qu'elle soit insérées dans une page web)... et la ça se complique car je dois faire ça sans fenêtre de rendu.
    La vraie question est "ou que je chope mon hdc dans ce cas ??"

    Parce que pour l'application classique j'ai un wglCreateContext(hdc) où hdc est le handle de ma fenetre de rendu. Et comme j'en ai pas dans ce cas, ben j'ai essayé de prendre celui d'un wxMemoryDC, ... mais sans résultat car le SetPixelFormat qui suit me renvoie false

    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
     
    PIXELFORMATDESCRIPTOR pfd =  
    	{
    		 sizeof(PIXELFORMATDESCRIPTOR),  //taille du descripteur
    		1, //version 
    		PFD_SUPPORT_OPENGL |
                    PFD_SUPPORT_GDI |
    		PFD_DRAW_TO_BITMAP | 
    		PFD_DOUBLEBUFFER, //Propriété 
    		PFD_TYPE_RGBA,  //Mode de couleurs 
    		32,  //Bits de couleur 
    		0, 0, 0, 0, 0, 0, //Paramètres des couleurs 
    		0,0,  //Paramètres 
    		0,  //Bits du buffer stencil  
    		0,  //Nombre de buffers auxiliaires 
    		0,  //ignoré (obsolète) 
    		0,  //réservé/code> 
    		0,  //ignoré (obsolète) 
    		0, //Couleur de transparence 
    		0  //Ignoré (obsolète) 
    	};   
     
    int pixelFormat;  
    pixelFormat = ChoosePixelFormat(dc, &pfd);  
    if (!pixelFormat)  {
       MessageBox( WindowFromDC(dc), "Mode graphique non supporté",   "Problème", MB_ICONERROR | MB_OK);
       exit(1);
       //Vérifie si un PixelFormat du type demandé existe
    }
     
    if (!SetPixelFormat(dc, pixelFormat, &pfd))  
    	{     
    		MessageBox(WindowFromDC(dc),	"Mode graphique non supporté", "Problème", MB_ICONERROR | MB_OK);
    	}
    J'ai bien vu dans la FAQ openGL le lien vers MESA... mais a vrai dire, ça me dit pas quel DC je lui donne ?!


    Quelqu'un aider moi ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    Tu devrais creer un context normal, a partir duquel tu va pouvoir creer un pixel buffer object (extension OpenGL). A Partir de ce moment, tu vas pouvoir rendre sur une surface Offscreen.

    Reste a charger cette surface de la memoire GPU vers la memoire CPU puis a l enregistrer via une API de lecture / Ecriture fichier image.

  3. #3
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Il faut utiliser les "pbuffer" c'est fait pour cela !

    Mot clé "wglCreatePbufferARB"

  4. #4
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    Citation Envoyé par Ti-R
    Il faut utiliser les "pbuffer" c'est fait pour cela !

    Mot clé "wglCreatePbufferARB"

    Certes ca permet de le faire mais ca reste une API windows WGL donc non portable. De plus, pour combler cette lacune, une extension est apparue "pixel buffer object" qui est portable elle. Je pense donc que l extension WGL devrait etre ignoree au profit de la seconde

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 118
    Par défaut
    Les pixel buffer object c'est autre chose : cela pemet d'utiliser un texture en entré d'un vertex-buffer object au lieu d'utiliser un tableau normale que l'on envoie au driver.

    Par contre, pour faire du rendu avec un extension OpenGL, il faut que tu regarde du cité des frame-buffer-object.

    http://oss.sgi.com/projects/ogl-samp...fer_object.txt

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    Mea culpa ... il fallait effectivement lire "framebuffer objet" et non pas pixelbuffer ...


    bien vu

  8. #8
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Citation Envoyé par smashy
    Certes ca permet de le faire mais ca reste une API windows WGL donc non portable. ... Je pense donc que l extension WGL devrait etre ignoree au profit de la seconde
    Oui mais pour faire du rendu offscreen sans fenêtre je crois qu'il faut passer par là, je ne connais que cette solution, sous Windows. il doit y avoir un équivalent sous les autres plateformes.

    Car il faut utiliser la fonction "wglGetPbufferDCARB", qui permet de créer son DC

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	g_pbuffer.hPBuffer = wglCreatePbufferARB( g_hDC, pixelFormat, g_pbuffer.nWidth, g_pbuffer.nHeight, NULL );
    	g_pbuffer.hDC      = wglGetPbufferDCARB( g_pbuffer.hPBuffer );
    	g_pbuffer.hRC      = wglCreateContext( g_pbuffer.hDC );
    Ce qui répond parfaitement à la question

    Parce que pour l'application classique j'ai un wglCreateContext(hdc) où hdc est le handle de ma fenetre de rendu. Et comme j'en ai pas dans ce cas, ben j'ai essayé de prendre celui d'un wxMemoryDC, ... mais sans résultat car le SetPixelFormat qui suit me renvoie false

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    Citation Envoyé par Ti-R
    Oui mais pour faire du rendu offscreen sans fenêtre je crois qu'il faut passer par là, je ne connais que cette solution, sous Windows.
    Effectivement, sous OpenGL avant de pouvoir creer toute ressource (texture ,vertex buffer .. et framebuffer object), il faut disposer d un context.

    On note toutefois que le changement de contexte est couteux en temps, car TOUS les etats OpenGL doivent etre mis a jour . Alors que le changement de cible (framebuffer) l est nettemment moins. En revanche les etats etant partages, il faut ce mefier des effets de bords entre deux passes successives sur deux frames differentes.

Discussions similaires

  1. import COLLADA => rendu openGL
    Par crischprolch dans le forum OpenGL
    Réponses: 1
    Dernier message: 05/06/2008, 15h36
  2. (c#)ou(c++)Rendu OpenGl sur une Bitmap
    Par pointer dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/03/2008, 15h08
  3. Rendu OpenGL sur un thread tier.
    Par Groove dans le forum OpenGL
    Réponses: 3
    Dernier message: 15/02/2007, 11h36
  4. Vitesse rendu onscreen/offscreen
    Par Burckel dans le forum OpenGL
    Réponses: 2
    Dernier message: 10/01/2007, 16h20
  5. Rendu OpenGL offscreen sous Windows
    Par rincevent_123 dans le forum OpenGL
    Réponses: 3
    Dernier message: 28/11/2003, 09h23

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