OpenGL - ShareLists
-
- Beiträge: 21
- Registriert: 20.06.2012, 20:14
OpenGL - ShareLists
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ß
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ß
-
- Beiträge: 21
- Registriert: 20.06.2012, 20:14
Re: OpenGL - ShareLists
Hi,
kann mir niemand weiterhelfen?
Gruß
kann mir niemand weiterhelfen?
Gruß
- kimmi
- Moderator
- Beiträge: 1405
- Registriert: 26.02.2009, 09:42
- Echter Name: Kim Kulling
- Wohnort: Luebeck
- Kontaktdaten:
Re: OpenGL - ShareLists
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
Gruß Kimmi
-
- Establishment
- Beiträge: 140
- Registriert: 03.10.2010, 20:14
Re: OpenGL - ShareLists
Hi,
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ß
So mach ich es im Moment auch.Meines Wissens nach bindet ein Context ein Fenster. Du bräuchtest also pro Fenster einen Context und müsstest diesen dann jeweils neu rendern.
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ß
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: OpenGL - ShareLists
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).
-
- Establishment
- Beiträge: 140
- Registriert: 03.10.2010, 20:14
Re: OpenGL - ShareLists
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ß
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ß
Zuletzt geändert von Raven280438 am 24.03.2014, 13:29, insgesamt 2-mal geändert.
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: OpenGL - ShareLists
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: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?
jaRaven280438 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?
-
- Establishment
- Beiträge: 140
- Registriert: 03.10.2010, 20:14
Re: OpenGL - ShareLists
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ß
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ß
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: OpenGL - ShareLists
sollte ausreichen...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 keine Probleme geben. Multithreading ist allerdings auch wieder so eine Sache, die ich mir in OpenGL lieber nicht antun würde...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)?
-
- Establishment
- Beiträge: 140
- Registriert: 03.10.2010, 20:14
Re: OpenGL - ShareLists
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ß
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ß
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: OpenGL - ShareLists
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...