OpenGL - ShareLists

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Brainfreeze
Beiträge: 21
Registriert: 20.06.2012, 20:14

OpenGL - ShareLists

Beitrag 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ß
Brainfreeze
Beiträge: 21
Registriert: 20.06.2012, 20:14

Re: OpenGL - ShareLists

Beitrag von Brainfreeze »

Hi,

kann mir niemand weiterhelfen?


Gruß
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: OpenGL - ShareLists

Beitrag 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
Raven280438
Establishment
Beiträge: 140
Registriert: 03.10.2010, 20:14

Re: OpenGL - ShareLists

Beitrag 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ß
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: OpenGL - ShareLists

Beitrag 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).
Raven280438
Establishment
Beiträge: 140
Registriert: 03.10.2010, 20:14

Re: OpenGL - ShareLists

Beitrag 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ß
Zuletzt geändert von Raven280438 am 24.03.2014, 13:29, insgesamt 2-mal geändert.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: OpenGL - ShareLists

Beitrag 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
Raven280438
Establishment
Beiträge: 140
Registriert: 03.10.2010, 20:14

Re: OpenGL - ShareLists

Beitrag 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ß
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: OpenGL - ShareLists

Beitrag 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...
Raven280438
Establishment
Beiträge: 140
Registriert: 03.10.2010, 20:14

Re: OpenGL - ShareLists

Beitrag 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ß
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: OpenGL - ShareLists

Beitrag 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...
Antworten