Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

05.08.2012, 19:41

[OpenGL | WinApi] - Mehrere Kontexte

Hallo,

ich wollte mir mehrere Kontexte erzeugen lassen. Hat auch funktioniert. Aber wenn ich meine Drawfunktion aufrufe, dann ist das Sprite nur auf dem 2. Kontext zu sehen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
while(window.isOpen() && window2.isOpen()) {
    window.handleMessages();

    glm::mat4 MVP = view.getProjection() * camera.getView() * sprite.getModel(); // PVM

    wglMakeCurrent(*window.gethDC(), *window.gethRC());
    window.clear(0.f, 0.f, 1.f, 0.f);
    renderer.useProgram();
    renderer.sendMatrix(renderer.getUniformLocation(program.getID(), "MVP"), MVP);
    sprite.draw(view, camera, program.getID());
    window.changeBuffers();
    wglMakeCurrent(NULL, NULL);

    wglMakeCurrent(*window2.gethDC(), *window2.gethRC());
    window2.clear(1.f, 0.f, 0.f, 0.f);
    renderer.useProgram();
    renderer.sendMatrix(renderer.getUniformLocation(program.getID(), "MVP"), MVP);
    sprite.draw(view, camera, program.getID());
    window2.changeBuffers();
    wglMakeCurrent(NULL, NULL);
}

Komisch finde ich, dass die Hintergrundfarbe, die ich bei beiden Fenstern übergebe stimmt, aber das Zeichnen von dem Sprite nicht stimmt. Damit meine ich, dass das Sprite beim ersten Kontext nicht zu sehen ist. Sondern nur beim 2. Kontext. Ich habe das Problem gegoogelt, aber da stand, dass man immer, dass man bevor man den aktiven Kontext wechselt, wglMakeCurrent(NULL, NULL) aufrufen soll. Das bringt aber nichts.

Ich hoffe ihr könnt mir helfen. :)

Mfg
Delop

Edit: Hab vergessen das hin zuschreiben: wglShareLists hat mir auch nicht geholfen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Delop« (05.08.2012, 20:02)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

05.08.2012, 20:14

Eine Ressource ist nur für einen Kontext gültig. Sie muss geshared werden. Ich nehme daher an du hast das Sharing nicht korrekt angewendet. Mal nach einem gl-Error geschaut?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

05.08.2012, 20:21

Ich kriege den OpenGL Fehler 1282. Ich habe es so geshared: wglShareLists(*window.gethRC(), *window2.gethRC()); Und das immer am Anfang der Hauptschleife. Vor der Hauptschleife kommt das selbe raus.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

05.08.2012, 20:35

Die Texturen sind da aber schon geladen und angelegt?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

05.08.2012, 20:39

Ja, ist es.

Edit: Wenn du nach der Fenstererzeugung meinst, ja.

6

05.08.2012, 21:17

Ich habe gerade herausgefunden, dass wenn ich wglMakeCurrent benutzte, den OpenGL 1282 Fehler bekomme...

Edit: Anscheinend wird nichts rendert, wenn ich nur bei einem Fenster zeichne oO.

7

17.09.2012, 16:32

Sry, wenn ich den älteren Thread jetzt wieder wiederbelebe...

Ich habe mich heute mal wieder mit dem Problem beschäftigt und dabei festgestellt, dass wenn ich die Ressourcen lade, nur in dem aktuellen Renderkontext ist (sollte auch so sein).
Wenn ich nach dem Ressourcen laden, BOOL result = wglShareLists(window2.gethRC(), window.gethRC()); aufrufe ist wglShareLists erfolgreich, aber bei BOOL result = wglShareLists(window.gethRC(), window2.gethRC()); schlägt wglShareLists fehl (aktueller Renderkontext ist der Kontext von dem 2. Fenster).

Die Ressourcen sind komischerweise trotzdem nur in dem einen Kontext drinnen, bei dem sie geladen wurden.

Und ich erhalte keinen OpenGL Fehler...
Ich hoffe ihr könnt mir helfen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

17.09.2012, 16:43

Vielleicht solltest Du mal in der API-Doku nachlesen, was genau wglShareLists eigentlich macht. Dann wird Dir auch klar werden, warum der Aufruf fehlschlägt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

17.09.2012, 16:45

Ich vermute mal, das Problem ist, dass beide Kontexte bereits Ressourcen enthalten!?

Abgesehen davon, würde ich nichtmehr mit diesen veralteten Funktionen arbeiten. Verwend besser wglCreateContextARB().

10

17.09.2012, 16:53

Vielleicht solltest Du mal in der API-Doku nachlesen, was genau wglShareLists eigentlich macht. Dann wird Dir auch klar werden, warum der Aufruf fehlschlägt.
Oh, ich dachte es würde die Ressources sharen, falsch gedacht...

Ich vermute mal, das Problem ist, dass beide Kontexte bereits Ressourcen enthalten!?

Abgesehen davon, würde ich nichtmehr mit diesen veralteten Funktionen arbeiten. Verwend besser wglCreateContextARB().
Nein, haben sie nicht. Ich benutzte schon wglCreateContextARB. Ich dachte wglShareLists macht was anderes...

Edit: Ah, ich denke, dass ich jetzt weis, wie ich es lösen kann. Ich melde mich wieder, wenn ich es schaffe.

Werbeanzeige