2013-01-10 12 views
6

Ho un compito per implementare il renderer OpenGL offscreen sia per Window che Linux in C++. Ho già una versione già scritta in Java usando LWJGL lib.There ho usato l'oggetto PBuffer, che sotto la cappa crea Pbuffer basato sul sistema operativo utilizzato. Prima ho pensato di ri-implementare la logica di creazione completa di PBuffer proprio come ho fatto nella sorgente nativa di LWJGL. Poi ho letto il this post su StackOverflow.com dove è suggerito l'uso della creazione di contesto standard, diciamo usando GLFW (che è multipiattaforma) ma non per creare la finestra effettiva. È la strada giusta da percorrere? Quali sono i pro ei contro contro l'uso di Pbuffer in questo caso?Creazione del contesto off-platform OpenGL multipiattaforma

Aggiornamento: voglio solo sottolineare che uso FBO per rendere i fotogrammi in modo il mio problema qui non è come eseguire il rendering in modalità fuori campo, ma come creare un contesto senza finestra sia in Windows e Linux OS.

risposta

5

Consiglio vivamente di non utilizzare più PBuffers ma di utilizzare Frame Buffer Objects (FBOs). Gli FBO offrono prestazioni molto migliori in quanto il loro utilizzo non richiede un interruttore di contesto e hanno lo several other advantages.

LWJGL supports FBOs, ma GLFW è "solo" per la configurazione multipiattaforma di OpenGL e not for rendering. Per un comodo utilizzo FBO multipiattaforma, ti consiglio di utilizzare una libreria come OGLplus su GLFW. Vedi here per un esempio di render-to-texture.

+0

Esattamente, suppongo di utilizzare gli FBO. Gli FBO non creano il contesto GL, ecco perché sto facendo questa domanda. –

+0

Se si desidera l'accelerazione hardware, almeno su Windows, non è possibile creare un contesto OpenGL senza prima creare una finestra (nascosta). Questo perché [wglCreateContext] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd374379 (v = vs.85) .aspx) prevede un Device Context (DC) e solo una finestra di DC può avere un formato pixel accelerato hardware assegnato. In particolare, non è possibile eseguire il rendering con OpenGL con accelerazione hardware in una memoria DC] (http://www.opengl.org/discussion_boards/showthread.php/161374-Why-can-ti-write-to-a-memory-device -context? p = 1143832 & viewFull = 1 # post1143832). – sschuberth

+0

Quindi intendi la versione di Windows di PBuffer in LWJGL crea comunque la finestra e quindi la rimuove? –

0

Per quanto ne so non esiste un modo multipiattaforma per creare i contesti, sarà necessario creare la propria astrazione e quindi implementarla per ogni piattaforma.

Su Windows ho usato il seguente codice per creare un secondo contesto per fare il caricamento di contenuti in un thread in background (questo programma utilizzato GLFW ma che non dovrebbe importa):

void Program::someFunction() 
{ 
    HDC hdc = wglGetCurrentDC(); 
    HGLRC hglrc = wglGetCurrentContext(); 
    HGLRC hglrc_new = wglCreateContext(hdc); 
    wglShareLists(hglrc, hglrc_new); 
    loadThread = boost::thread(&Program::loadFunc, this, hdc, hglrc_new); 
} 

/** 
* Imports all our assets. Supposed to run in its own thread with its own OpenGL context. 
* @param hdc The current device context. 
* @param hglrc A OpenGL context thats shares its display list with the main rendering context. 
*/ 
void Program::loadFunc(HDC hdc, HGLRC hglrc) 
{ 
    wglMakeCurrent(hdc, hglrc); 

     //Do stuff... 

    wglMakeCurrent(NULL, NULL); 
    wglDeleteContext(hglrc); 
} 
+0

In questo caso sono principalmente interessato all'installazione di Linux. –

2

Il Simple DirectMedia Layer (Libreria SDL) vale la pena provare. Semplifica la creazione del contesto OpenGL multipiattaforma, con la possibilità di utilizzare le superfici di memoria per il rendering fuori schermo.

L'unica cosa che dovresti fare di più, è includere le intestazioni OpenGL e SDL da posizioni diverse, a seconda della piattaforma. Questo può essere fatto con semplici direttive pre-processore.

Problemi correlati