Seite 1 von 1
OpenGL - ShareLists
Verfasst: 22.03.2014, 18:23
von Brainfreeze
Hi,
Wenn ich OpenGL in verschiedenen Fenstern rendern will (zB mit wxWidgets für einen MapEditor), bieten sich da wglShareLists an?
So wie ich das verstanden habe, sind dann alle Resourcen in allen verbundenen Contexten erreichbar.
Im Moment muss ich bei jeder Aktion ein wglMakeCurrent() aufrufen, um sicher zu sein, im richtigen Context zu sein.
Ausserdem müssten dann ja Resourcen wie Texturen etc. nur 1 mal im Speicher liegen, oder?
Gruß
Re: OpenGL - ShareLists
Verfasst: 23.03.2014, 20:59
von Brainfreeze
Hi,
kann mir niemand weiterhelfen?
Gruß
Re: OpenGL - ShareLists
Verfasst: 24.03.2014, 11:53
von kimmi
Meines Wissens nach bindet ein Context ein Fenster. Du bräuchtest also pro Fenster einen Context und müsstest diesen dann jeweils neu rendern. Die FBO sind leider an einen Context gebunden. Du könntest ein globales Fenster nehmen, dieses in verschiedene Texturen unterteilen und da mittel Render2Texture die jeweilige View daaraf rendern und am Ende die Texture in dein Fenster rendern. Das ist auch bedeutend billiger als für jedes Fester den Context mittels MakeCurrent zu wechseln.
Gruß Kimmi
Re: OpenGL - ShareLists
Verfasst: 24.03.2014, 12:21
von Raven280438
Hi,
Meines Wissens nach bindet ein Context ein Fenster. Du bräuchtest also pro Fenster einen Context und müsstest diesen dann jeweils neu rendern.
So mach ich es im Moment auch.
Mein Problem ist, dass ich vor jedem glGenBuffer(), glGenTextures() etc. sicherstellen muss, im richtigen Context zu sein.
Kann man das mit SharedLists umgehn?
Alternative Möglichkeit: Ich habe eine zentrale Klasse, wo alle existierenden Contexte gespeichert sind.
Da könnte ich mitspeichern, welcher zuletzt als Current gesetzt wurde, und nur im Fall der Änderung das wglMakeCurrent() aufrufen.
Gruß
Re: OpenGL - ShareLists
Verfasst: 24.03.2014, 12:40
von dot
Ja, wglShareLists() würde genau das tun, was du gerne hättest. Ich würde allerdings generell empfehlen, wglCreateContextAttribsARB() statt dem veralteten wglCreateContext() zu verwenden, dort kannst du unter anderem direkt einen Context zum Sharen angeben. Außerdem sollte es möglich sein, per wglMakeCurrent() den gleichen Context auf den HDC eines anderen Fensters zu setzen, so lange der HDC das selbe Pixelformat hat und mit der selben GPU assoziiert ist (was kein Problem sein sollte, denn multi GPU kannst du mit OpenGL unter Windows leider sowieso knicken).
Re: OpenGL - ShareLists
Verfasst: 24.03.2014, 13:15
von Raven280438
Hi,
danke für die Antwort.
Also muss ich beim Starten des Programms erstmal einen "Main"-SharedContext erstellen.
Und bei jedem neuen Fenster (und dem dazugehörigen RenderContext) als 2. Parameter von wglCreateContextAttribsARB() den MainContext angeben?
Heist das, wenn RenderContext 1 und RenderContext 2 beide den gleichen SharedContext haben, dass dann Rendercontext1 auch auf Resourcen von RenderContext2 zugreifen kann?
Gruß
Re: OpenGL - ShareLists
Verfasst: 24.03.2014, 13:27
von dot
Raven280438 hat geschrieben:Also muss ich beim Starten des Programms erstmal einen "Main"-SharedContext erstellen.
Und bei jedem neuen Fenster (und dem dazugehörigen RenderContext) als 2. Parameter von wglCreateContextAttribsARB() den MainContext angeben?
Du brauchst keinen separaten Context, einfach beim Context für das erste Fenster 0 als hshareContext angeben und bei jedem weiteren Context dann den ersten Context als hshareContext verwenden und fertig.
Raven280438 hat geschrieben:Heist das, wenn RenderContext 1 und RenderContext 2 beide den gleichen SharedContext haben, dass dann Rendercontext1 auch auf Resourcen von RenderContext2 zugreifen kann?
ja
Re: OpenGL - ShareLists
Verfasst: 24.03.2014, 13:29
von Raven280438
Hi,
Oder reicht es aus, wie du geschrieben hast, nur einen RenderContext zu haben, und nur vor der Render-Routine ein wglMakeCurrent() auf den jeweiligen WindowHandle zu machen?
Wie man merkt hab ich nicht so viel Erfahrung in OpenGL. Kann es da später zu irgendwelchen Problemen kommen (bei MultiThreading oder sowas)?
Gruß
Re: OpenGL - ShareLists
Verfasst: 24.03.2014, 13:35
von dot
Raven280438 hat geschrieben:Oder reicht es aus, wie du geschrieben hast, nur einen RenderContext zu haben, und nur vor der Render-Routine ein wglMakeCurrent() auf den jeweiligen WindowHandle zu machen?
sollte ausreichen...
Raven280438 hat geschrieben:Wie man merkt hab ich nicht so viel Erfahrung in OpenGL. Kann es da später zu irgendwelchen Problemen kommen (bei MultiThreading oder sowas)?
Sollte keine Probleme geben. Multithreading ist allerdings auch wieder so eine Sache, die ich mir in OpenGL lieber nicht antun würde...
Re: OpenGL - ShareLists
Verfasst: 24.03.2014, 18:46
von Raven280438
Hi,
eine Frage hab ich noch:
Wenn ich mehrere Render-Contexte habe mit einer Sharedlist, muss ich da auch bei jeder Frame den Viewport neu setzen, oder bleibt der im jeweiligen Context gespeichert?
Bei dem globalen Render-Context muss ich ja für jedes Fenster immer den Viewport neu setzen, oder?
Gruß
Re: OpenGL - ShareLists
Verfasst: 24.03.2014, 18:52
von dot
Ein Render Context repräsentiert nichts anderes als eine Instanz von OpenGL mitsamt allem State. Wenn du in einem Context glViewport() aufrufst, dann bleibt dieser Viewport in diesem Context so lange bestehen, bis du ihn in diesem Context wieder änderst. Wenn du irgendwas in deinem current Context machst, ändert das nichts am State irgendeines anderen Context...