[OpenGL] Auf MemoryDC rendern?
-
Hallo,
mich würde mal interessieren, ob es überhaupt funktionieren kann, auf einem MemoryDC mit OpenGL zu rendern?
Bisher habe ich es geschafft, mit dem MemoryDC den Renderkontext zu erstellen, aber ich kann ihn nicht mit wglMakeCurrent() aktivieren. Denn bekomme ich den Fehler:
ERROR_CLIPPING_NOT_SUPPORTED
2005 The requested clipping operation is not supported.Obwohl beim MemoryDC die CLIPCAPS eingeschalten sind:
if(::GetDeviceCaps(hDC, CLIPCAPS)) cout << "clipcaps enabled" << endl;Hat es schonmal jemand hinbekommen, auf dem MemoryDC zu rendern oder ist es generell unmöglich?
Grüße,
don_basto.
-
Es scheint möglich zu sein:
http://support.microsoft.com/?scid=kb%3Ben-us%3B132866&x=16&y=123. Create a bitmap that can be either a DIB section or a screen compatible bitmap, and select it into the memory device context. This bitmap must have four or more bits of color information per pixel.
4. Set the pixel format of the memory device context.
5. Create a rendering context, passing the wglCreateContext function the handle to the memory device context, and make that rendering context a thread's current rendering context.
6. Make OpenGL calls, which will draw into that rendering context.Kann mir jemand weiterhelfen?
-
Vielleicht schreibst Du mal, was Du bislang hast.
Hast Du ein kompatibles Bitmap erstellt?
Hast Du es per SelectObject(DC, Bitmap) in dem Context als "aktiv" gesetzt?
Wo scheitert es?
-
Das Problem ist, dass ich den HDC und die Bitmapdaten von einer Schnittstelle erhalte, auf die ich keinen Einfluss habe.
Zum besseren Verständnis hab ich jetzt erstmal versucht, eine OpenGL-Bitmap nach dem MSDN-Link oben zu erstellen, also auf einem von mir angelegten Speicher-DC.
Die gute Nachricht: Keine Fehlermeldungen.
Die schlechte Nachricht: keine GL-Szene.Da hab ich gerade keinen Ansatz, wo ich suchen könnte. Also GL malt ohne zu meckern, dem Windows scheint es gut zu gehen, aber das Fenster bleibt schwarz.

Habt ihr eine Idee?
Fragend,
don_basto.PS: Der gesamte Kode ist ein bissl lang zum Posten.
-
Vermutlich liegt der Fehler hier, da im Fenster das Bitmap mit der Szene nicht dargestellt wird:
if (!(hDC=::GetDC(hWnd))) return false; ::GetObject(hBitmap, sizeof(BITMAP), &bm); ::BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); ::ReleaseDC(hWnd, hDC);
-
Eine Aktualisierung:
Ich bin mir jetzt sicher, dass es am übergeben HDC liegt. Allerdings würde ich gern den Grund wissen ?!?
Nachdem ich einen sehr nütlichen Artikel im MSDN gefunden (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnopen/html/msdn_gl6.asp) und nachprogrammiert habe, wobei ich mir einen eigenen MemoryDC anlege und dann auf den übergebenen HDC blitte, funktioniert's prima.
Sobald ich versuche, direkt auf den HDC zu rendern erhalte ich einen ERROR_ACCESS_DENIED, wenn ich den Renderkontext setzen will:wglMakeCurrent(_hDC, _hRC);Weiß jemand, warum?