2013-01-10 18 views
6

Ich habe eine Aufgabe OpenScreen-Renderer für Windows und Linux in C++ zu implementieren.Ich habe eine solche Version bereits in Java mit LWJGL lib.Hier habe ich PBuffer-Objekt, das unter der Haube erstellt Pbuffer basierend auf dem verwendeten Betriebssystem. Zuerst dachte ich, die volle PBuffer Erstellungslogik zu re-implementieren, so wie ich es in nativen Quelle von LWJGL getan habe. Dann lese ich this Post auf StackOverflow.com, wo es vorgeschlagen wird, die Standardkontexterstellung, Nehmen wir an, wir verwenden GLFW (was plattformübergreifend ist), aber nicht um das eigentliche Fenster zu erstellen. Ist es der richtige Weg? Was sind Vor- und Nachteile gegen die Verwendung von Pbuffer in einem solchen Fall?Erstellen plattformübergreifender OpenGL-Offscreen-Kontext

Update: Ich möchte nur betonen, dass ich FBOs verwenden, um die Bilder zu machen, so hier mein Problem ist nicht, wie Off-Screen-Modus zu machen in, sondern wie einen Kontext, ohne Fenster zu schaffen sowohl in Windows- und Linux-Betriebssystemen.

Antwort

5

Ich würde dringend empfehlen, PBuffers nicht mehr zu verwenden, sondern stattdessen zu verwenden. FBOs bieten eine viel bessere Leistung, da ihre Verwendung keinen Kontextwechsel erfordert und sie several other advantages haben.

LWJGL supports FBOs, aber GLFW ist "nur" für Cross-Plattform-Setup von OpenGL und not for rendering. Für eine praktische plattformübergreifende FBO-Nutzung würde ich empfehlen, eine Bibliothek wie oben auf GLFW zu verwenden. Ein Render-to-Texture-Beispiel finden Sie unter here.

+0

Das stimmt, ich nehme an, FBOs zu verwenden. Aber FBOs erstellen keinen GL Kontext, deshalb stelle ich diese Frage. –

+0

Wenn Sie Hardwarebeschleunigung möchten, können Sie zumindest unter Windows keinen OpenGL-Kontext erstellen, ohne zuerst ein (verborgenes) Fenster zu erstellen. Das liegt daran, dass [wglCreateContext] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd374379 (v = vs.85) .aspx) einen Gerätekontext (DC) und nur den DC eines Fensters erwartet kann ein hardwarebeschleunigtes Pixelformat zugewiesen bekommen. Insbesondere können Sie [nicht mit hardwarebeschleunigter OpenGL in einen Speicher-DC rendern] (http://www.opengl.org/discussion_boards/showthread.php/161374-Whi-can-ti-write-to-a-memory-device -kontext? p = 1143832 & viewfull = 1 # post1143832). – sschuberth

+0

Also meinst du meine Windows-Version von PBuffer in LWJGL erstellt sowieso Fenster und entfernt es dann? –

0

Soweit ich weiß, gibt es keine plattformübergreifende Möglichkeit, Kontexte zu erstellen, Sie müssen Ihre eigene Abstraktion erstellen und diese dann für jede Plattform implementieren.

Unter Windows habe ich den folgenden Code verwendet, um einen zweiten Kontext zu schaffen, zu tun Laden von Inhalten in einem Hintergrundthread (dieses Programm verwendete GLFW aber das sollte keine Rolle spielen):

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

Ich bin in diesem Fall vor allem am Linux-Setup interessiert. –

2

The Simple Directmedia Layer (SDL) -Bibliothek ist einen Versuch wert. Es vereinfacht die plattformübergreifende Erstellung von OpenGL-Kontexten und ermöglicht die Verwendung von Speicheroberflächen für das Rendern außerhalb des Bildschirms.

Die einzige Sache, die Sie extra tun müssten, ist, Ihre OpenGL- und SDL-Header von verschiedenen Standorten abhängig von Ihrer Plattform zu integrieren. Dies kann mit einfachen Pre-Prozessor-Direktiven erfolgen.

Verwandte Themen