- procedure TOpenGLPersForm.InitBitmap;
- var
- Dummy: HPALETTE;
- begin
- try
- OpenglBitmap.width:=printer.pagewidth;
- OpenglBitmap.height:=printer.pageheight;
- OpenGLBitmap.Canvas.Lock;
- BitmapDC := OpenGLBitmap.Canvas.Handle;
- BitmapRC := CreateRenderingContext(BitmapDC, [opGDI], 24, 0, 0, 0,0, Dummy);
- ActivateRenderingContext(BitmapDC, BitmapRC);
- // Tiefenpuffer aktivieren
- glEnable(GL_DEPTH_TEST);
- // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
- glDepthFunc(GL_LESS);
- glViewPort(0,0,OpenGLBitmap.Width,OpenGLBitmap.Height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45.0, OpenGLBitmap.Width/OpenGLBitmap.Height, Nearclipping, Farclipping);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity;
- except
- Showmessage('InitBitmap fehlgeschlagen!');
- BitmapRC:=0;
- if (OpenGLBitmap.Canvas.LockCount > 0) then OpenGLBitmap.Canvas.Unlock;
- end;
- end;
- procedure TOpenGLPersForm.BitBtnDruckClick(Sender: TObject);
- begin
- Timer1.enabled:=false;
- DeactivateRenderingContext;
- InitBitmap;
- glEnable(GL_DEPTH_TEST);
- // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
- glDepthFunc(GL_LESS);
- //FarbenGL.Hintergrund
- glClearColor((FarbenGL.Hintergrund and $FF)/255,
- (FarbenGL.Hintergrund and $FF00 shr 8)/255,
- (FarbenGL.Hintergrund and $FF0000 shr 16)/255,
- 0.0);
- glLoadIdentity;
- glMatrixMode(GL_PROJECTION);
- // Identitätsmatrix laden
- glLoadIdentity;
- // Viewport an Clientareal des Fensters anpassen
- glViewPort( 0, 0, OpenGlBitmap.width, OpenGlBitmap.height);
- // Perspective, FOV und Tiefenreichweite setzen
- gluPerspective(60, OpenGlBitmap.width/OpenGlBitmap.height, Nearclipping, Farclipping);
- Rendern;
- SwapBuffers(DC);
- Printer.BeginDoc;
- //Übergabe von Bitmap auf Printer
- BitBlt(Printer.Canvas.Handle,0,0,Printer.pagewidth,Printer.pageheight,
- BitmapDC,0,0,SRCCOPY);
- Printer.EndDoc;
- DeactivateRenderingContext;
- DestroyRenderingContext(BitmapRC);
- ActivateRenderingContext(DC, RC);
- Timer1.enabled:=true;
- end;