2013-01-10 19 views
6

Mam zadanie zaimplementowania pozaekcyjnego renderera OpenGL zarówno dla Window'a jak i Linuxa w C++ Mam taką wersję napisaną już w Javie używając LWJGL lib.There użyłem obiektu PBuffer, który pod maską tworzy Pbuffery oparte na używanym systemie operacyjnym. Najpierw pomyślałem o ponownym wdrożeniu pełnej logiki tworzenia PBuffer, tak jak to zrobiłem w natywnym źródle LWJGL. Potem czytam post na this na StackOverflow.com, gdzie sugeruje się użycie standardowego tworzenia kontekstu, powiedzmy, używając GLFW (która jest platformą międzyplatformową), ale nie do utworzenia rzeczywistego okna. Czy jest to właściwa droga? Jakie są plusy i minusy w porównaniu do używania Pbuffera w takim przypadku?Tworzenie wieloplatformowego kontekstu OpenGL poza ekranem

Aktualizacja: Chcę tylko podkreślić, że używam FBOs do renderowania klatek więc mój problem nie jest tu jak renderowanie w trybie poza ekranem, ale jak stworzyć kontekst bez okna zarówno w systemach operacyjnych Windows i Linux.

Odpowiedz

5

Zdecydowanie nie będę już używać PBuffers, ale zamiast tego będę używał Frame Buffer Objects (FBOs). Serwery FBO oferują znacznie lepszą wydajność, ponieważ ich używanie nie wymaga przełączania kontekstu i mają one wartość several other advantages.

LWJGL supports FBOs, ale GLFW jest "po prostu" dla wieloplatformowej konfiguracji OpenGL i not for rendering. Aby wygodnie korzystać z wieloplatformowego FBO, polecam użyć biblioteki takiej jak OGLplus na górze GLFW. Zobacz here dla przykładu renderowania do tekstury.

+0

Zgadza się. Zakładam, że korzystam z FBO. Ale FBO nie tworzą kontekstu GL, dlatego właśnie zadaję to pytanie. –

+0

Jeśli chcesz przyspieszyć sprzęt, przynajmniej w systemie Windows, nie możesz utworzyć kontekstu OpenGL bez uprzedniego utworzenia okna (ukrytego). Dzieje się tak, ponieważ [wglCreateContext] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd374379 (v = vs.85) .aspx) oczekuje kontekstu urządzenia (DC) i tylko DC w oknie może mieć przydzielony sprzętowo przyspieszony format pikseli. W szczególności [nie można renderować za pomocą sprzętowo przyspieszonej biblioteki OpenGL w pamięci DC] (http://www.opengl.org/discussion_boards/showthread.php/161374-Wi -can-ti-write-to-a-memory-device -context? p = 1143832 i viewfull = 1 # post1143832). – sschuberth

+0

Więc masz na myśli Windows wersja PBuffer w LWJGL tworzy okno mimo to, a następnie usuwa go? –

0

O ile mi wiadomo, nie ma międzyplatformowego sposobu tworzenia kontekstów, trzeba będzie stworzyć własną abstrakcję, a następnie zaimplementować ją dla każdej platformy.

Na oknach Użyłem poniższy kod, żeby utworzyć drugi kontekst zrobić ładowanie zawartości w wątku tła (program używany GLFW ale to nie powinno mieć znaczenia):

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

Najbardziej interesuje mnie konfiguracja systemu Linux w tym przypadku. –

2

Simple DirectMedia Layer (SDL) warto spróbować. Upraszcza tworzenie wieloplatformowych kontekstów OpenGL, z możliwością wykorzystania powierzchni pamięci do renderowania poza ekranem.

Jedyne, co musisz zrobić, to dołączyć nagłówki OpenGL i SDL z różnych lokalizacji, w zależności od platformy. Można to zrobić za pomocą prostych dyrektyw preprocesora.

Powiązane problemy