Drucken mit OpenGL in falschen Farben
-
Hallo,
ich habe eine DLL geschrieben, in der ich eine Klassenhierarchie von OpenGL Renderingkontexten für technische Zwecke (technische Zeichnung, 3D Kontexte zur Simulation von CNC Programmen usw.) untergebracht habe. Den Inhalt (die Darstellung) dieser Kontexte soll man auch zu Papier bringen, also drucken koennen. Das funktioniert auch. Leider werden dabei aber die Farben
"invertiert(?)". Das heißt, aus ROT wird BLAU und aus BLAU wird ROT. GRÜN bleibt GRÜN. Ich habe nicht die Reihenfolge bei der Definition vertauscht. Es werden die gleichen Funktionen für das Zeichnen auf dem Bildschirm und das Drucken aufgerufen. Die "Vertauschung" der Farben erfolgt sowohl bei Objekten, die ich über Darstellungslisten anzeige als bei direkt gezeichneten Objekten. Hier nun der Code der Funktion zum Drucken. Der Parameter "HDC hDc" ist der Handle für den DeviceContext des Druckers und der Parameter "HFONT hFont" der Handle des Druckerfonts.///////////////////////////////////////////////////////////////////////////// // Drucken void GLBaseContext::Print(HDC hDc, HFONT hFont, int left, int top, int right, int bottom, int dist, double scale, const char* headline){ TEXTMETRIC tm; int nPixelFormat, charHeight, charWidth, cx, cy, pleft, ptop, pbottom, width, height; double scl; PIXELFORMATDESCRIPTOR pfd; pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; pfd.dwFlags = 0; pfd.dwFlags |= PFD_SUPPORT_GDI; pfd.dwFlags |= PFD_SUPPORT_OPENGL; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = ColorBits; // Farbtiefe pfd.cRedBits = RedBits; pfd.cRedShift = RedShift; pfd.cGreenBits = GreenBits; pfd.cGreenShift = GreenShift; pfd.cBlueBits = BlueBits; pfd.cBlueShift = BlueShift; pfd.cAlphaBits = AlphaBits; // Alpha Buffer pfd.cAlphaShift = AlphaShift; pfd.cAccumBits = AccumBits; // Accumulation Buffer pfd.cAccumRedBits = AccumRedBits; pfd.cAccumGreenBits = AccumGreenBits; pfd.cAccumBlueBits = AccumBlueBits; pfd.cAccumAlphaBits = AccumAlphaBits; pfd.cDepthBits = DepthBits; // Z-Buffer pfd.cStencilBits = StencilBits; // Stencil Buffer pfd.cAuxBuffers = AuxBuffers; // Auxiliary Buffer pfd.iLayerType = PFD_MAIN_PLANE; pfd.bReserved = 0; // reserviert pfd.dwLayerMask = LayerMask; pfd.dwVisibleMask = VisibleMask; pfd.dwDamageMask = DamageMask; // Ausdehnungen der Seite holen... cx = ::GetDeviceCaps(hDc, HORZRES); cy = ::GetDeviceCaps(hDc, VERTRES); ::GetTextMetrics(hDc, &tm); charHeight = tm.tmHeight; charWidth = tm.tmAveCharWidth; // automatische Auswahl des Pixelformates, das am besten passt nPixelFormat = ::ChoosePixelFormat(hDc, &pfd); if(nPixelFormat == 0){ // Fehler... ::DeleteDC(hDc); ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ::GetLastError(), 0, SystemMessage, 255, NULL); SetMsg("ChoosePixelFormat: ",SystemMessage); OGLMessage("OpenGL-Intialisierung fuer Druckerkontext!", MR_ERROR); return; // zurueck... } // Pixelformat fuer den Device Context setzen und auf Fehler pruefen... if(!::SetPixelFormat(hDc, nPixelFormat, &pfd)){ ::DeleteDC(hDc); ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ::GetLastError(), 0, SystemMessage, 255, NULL); SetMsg("SetPixelFormat: ",SystemMessage); OGLMessage("OpenGL-Intialisierung fuer Druckerkontext!", MR_ERROR); return; // zurueck... } HGLRC hPRC = wglCreateContext(hDc); // Renderingkontext erzeugen... wglMakeCurrent(hDc, hPRC); // und verbinden... Printing = true; // es wird gedruckt... if((PrintFont2D = Create2DFont(hDc, hFont, 32, 96)) == NULL){ // DruckFont erzeugen wglMakeCurrent(NULL, NULL); wglDeleteContext(hPRC); Printing = false; // es wird nicht mehr gedruckt ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ::GetLastError(), 0, SystemMessage, 255, NULL); SetMsg("Create2DFont: ",SystemMessage); OGLMessage("OpenGL-Intialisierung fuer Druckerkontext!", MR_ERROR); return; // zurueck... } glClearColor(1.0f, 1.0f, 1.0f, 0.0f); // weiss als Hintergrundfarbe... glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Farb- und Tiefenpuffer loeschen glMatrixMode(GL_MODELVIEW); glLoadIdentity(); pleft = left * charWidth; // linke Position berechnen... pbottom = bottom * charHeight; // untere Position berechnen... width = cx - pleft - right * charWidth; // Breite berechnen... height = cy - pbottom - (top + 2) * charHeight; // Hoehe berechnen... ptop = pbottom + height; if(headline){ // Titelzeile drucken... ptop -= charHeight; // obere Position berechnen... glViewport(pleft, ptop, width, charHeight); // Viewport setzen... glColor3f(0.0f, 0.0f, 0.0f); // Druckfarbe setzen... glRasterPos2f(-1.0f, -0.5f); // Ausgabeposition bestimmen... Draw2DText(headline); // Ueberschrift ausgeben... height -= (dist + 1) * charHeight; // Hoehe um Ueberschrift und Leerzeilen verringern } scl = (double(Width) / double(Height)) / (double(width) / double(height)); if(scl > 1.0){ // Hoehe skalieren?... height = int(double(width) * double(Height) / double(Width)); // neue Hoehe berechnen... if(headline){ // mit Titelzeile drucken... pbottom = ptop - height; // untere Position verschieben... height -= dist * charHeight; // Hoehe um Leerzeilen verringern } } PrintGL(pleft, pbottom, width, height, scale); // Drucken der eigentlichen Objekte... glFinish(); // Grafikausgabe abschliessen... Printing = false; // es wird nicht mehr gedruckt... wglMakeCurrent(NULL,NULL); // Verbindung mit Druckerkontext aufheben... wglDeleteContext(hPRC); // Renderingkontext loeschen... if(PrintFont2D) delete PrintFont2D; // DruckFont vorhanden? => loeschen PrintFont2D = NULL; // kein Druckfont mehr vorhanden }
Warum werden die Farben invertiert dargestellt?
Vielen Dank schon mal im Voraus.
Gruß RastowMax