Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 05, 2025 08:31

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Drucken mit OpenGL
BeitragVerfasst: Di Sep 28, 2004 16:02 
Offline
DGL Member

Registriert: Di Sep 28, 2004 15:46
Beiträge: 54
Hallo,

Ich beschäftige mich nun seit einer Woche mit OpenGL. Habe auch die ersten Erfolge. Nun aber gerate ich an die erste (für mich) wirkliche Hürde. Ich möchte die über OpenGL auch ausdrucken und zwar so das auf Papiergröße gerendert wird. Habe ein bissel im Internet gelesen, aber bei mir klappts nicht so wie ich mir das vorstelle. Wer kann mir helfen. Zum Ausdruck will ich auf einem DIB rendern.

Procedure TOpenGLPersForm.Printout;
Var
pbits : Pointer;
bmpinfo : TBITMAPINFO;
hBitmap : HDC;
pDC : HDC;
nPixelFormat :Integer;
pfd : TPixelFormatDescriptor;
bmi:TBitmapInfo;
hrc:hdc;
begin
fillchar(bmi,sizeof(bmi),0);
with bmi.bmiHeader do
begin
biSize:=sizeof(bmi.bmiHeader);
biWidth:=Printer.pagewidth; // SizeX
biHeight:=-printer.pageheight; // -SizeY because of top-down bitmap
biPlanes:=1;
biBitCount:=16; // Color depth
biCompression:=BI_RGB;
biSizeImage:=0;
biXPelsPerMeter:=2834; // 72 dpi screen These two fields should
biYPelsPerMeter:=2834; // 72 dpi screen not be that important
biClrUsed:=0;
biClrImportant:=0;
end;
HBitmap:=CreateDIBSection(0,bmi,DIB_RGB_COLORS,pbits,0,0);

dc:=getdc(hbitmap);
// Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
// Erstellten Renderkontext aktivieren
ActivateRenderingContext(DC, RC);
...
..
.

Nun ist leider schon der Rückgabewert von Getdc(hbitmap)=0, was unweigerlich zu Fehlern führt...
Wäre über jede Hilfe dankbar...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 06, 2004 07:16 
Offline
DGL Member

Registriert: Di Sep 28, 2004 15:46
Beiträge: 54
So habe nun eine Lösung gefunden. Leider funtioniert das nicht mit dem Boardheader. Habs mit mehreren andern ausprobiert. Mit dem von Mike Lischke hats gefunzt.

Code:
  1. procedure TOpenGLPersForm.InitBitmap;
  2. var
  3.   Dummy: HPALETTE;
  4. begin
  5.   try
  6.     OpenglBitmap.width:=printer.pagewidth;
  7.  
  8.     OpenglBitmap.height:=printer.pageheight;
  9.  
  10.     OpenGLBitmap.Canvas.Lock;
  11.  
  12.     BitmapDC := OpenGLBitmap.Canvas.Handle;
  13.  
  14.     BitmapRC := CreateRenderingContext(BitmapDC, [opGDI], 24, 0, 0, 0,0, Dummy);
  15.  
  16.     ActivateRenderingContext(BitmapDC, BitmapRC);
  17.  
  18.     // Tiefenpuffer aktivieren
  19.     glEnable(GL_DEPTH_TEST);
  20.  
  21.     // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
  22.     glDepthFunc(GL_LESS);
  23.  
  24.     glViewPort(0,0,OpenGLBitmap.Width,OpenGLBitmap.Height);
  25.  
  26.     glMatrixMode(GL_PROJECTION);
  27.  
  28.     glLoadIdentity();
  29.  
  30.     gluPerspective(45.0, OpenGLBitmap.Width/OpenGLBitmap.Height, Nearclipping, Farclipping);
  31.  
  32.     glMatrixMode(GL_MODELVIEW);
  33.  
  34.     glLoadIdentity;
  35.   except
  36.     Showmessage('InitBitmap fehlgeschlagen!');
  37.  
  38.     BitmapRC:=0;
  39.  
  40.     if (OpenGLBitmap.Canvas.LockCount > 0) then OpenGLBitmap.Canvas.Unlock;
  41.   end;
  42. end;
  43.  
  44. procedure TOpenGLPersForm.BitBtnDruckClick(Sender: TObject);
  45. begin
  46.   Timer1.enabled:=false;
  47.  
  48.   DeactivateRenderingContext;
  49.  
  50.   InitBitmap;
  51.  
  52.   glEnable(GL_DEPTH_TEST);
  53.   // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
  54.  
  55.   glDepthFunc(GL_LESS);
  56.   //FarbenGL.Hintergrund
  57.  
  58.   glClearColor((FarbenGL.Hintergrund and $FF)/255,
  59.                (FarbenGL.Hintergrund and $FF00 shr 8)/255,
  60.                (FarbenGL.Hintergrund and $FF0000 shr 16)/255,
  61.                0.0);
  62.  
  63.   glLoadIdentity;
  64.  
  65.   glMatrixMode(GL_PROJECTION);
  66.   // Identitätsmatrix laden
  67.   glLoadIdentity;
  68.  
  69.   // Viewport an Clientareal des Fensters anpassen
  70.   glViewPort( 0, 0, OpenGlBitmap.width, OpenGlBitmap.height);
  71.  
  72.   // Perspective, FOV und Tiefenreichweite setzen
  73.   gluPerspective(60, OpenGlBitmap.width/OpenGlBitmap.height, Nearclipping, Farclipping);
  74.  
  75.   Rendern;
  76.  
  77.   SwapBuffers(DC);
  78.  
  79.   Printer.BeginDoc;
  80.  
  81.   //Übergabe von Bitmap auf Printer
  82.   BitBlt(Printer.Canvas.Handle,0,0,Printer.pagewidth,Printer.pageheight,
  83.     BitmapDC,0,0,SRCCOPY);
  84.  
  85.   Printer.EndDoc;
  86.  
  87.   DeactivateRenderingContext;
  88.  
  89.   DestroyRenderingContext(BitmapRC);
  90.  
  91.   ActivateRenderingContext(DC, RC);
  92.  
  93.   Timer1.enabled:=true;
  94. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 06, 2004 09:03 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Kannst Du sagen wieso es mit dem DGL-Header net ging? :?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 06, 2004 10:44 
Offline
DGL Member

Registriert: Di Sep 28, 2004 15:46
Beiträge: 54
Wenn ich folgende Zeile mit dem DGL-Header probiert habe hatte BitmapRC anschließend den Wert 0.
Code:
  1.  
  2. BitmapRC := CreateRenderingContext(BitmapDC, [opGDI], 24, 0, 0, 0,0, Dummy);
  3. // der DGL-Header erwartet auch andere Parameter
  4.  

Hatte auch kurz in die Header reingeschaut, da ich aber blutiger GL-Anfänger bin... Es schien innerhalb der Procedure mit Palette was nicht gefunzt zu haben...?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 06, 2004 10:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
AFAIK kann kaum eine Hardware-OpenGL-Implementation in ein Bitmap renern. Mit der Software-Implementation von Microsoft geht das alllerdings, also musst du diese nutzen. Dort gibts dann allerdings nur OpenGL-Features bis einschliesslich Version 1.1. Alternativ solltest du dir mal MESA ansehen, aber dazu gabs hier schon diverse Threads (auch welche zum Thema "in ein Bitmap rendern"), also bequeme mal die Suche.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 06, 2004 11:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
Printing of opengl scenes can also be taken a step further: http://www.opengl.org/resources/code/re ... dback.html
this allows to render to an eps file (postscript)

Also can't you make a screendump after rendering? I believe i have seen such things on the forum allowing to write the screen to an bitmap file.

_________________
http://3das.noeska.com - create adventure games without programming


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drucken mit OpenGL
BeitragVerfasst: Di Aug 16, 2011 10:48 
Offline
DGL Member

Registriert: Di Sep 28, 2004 15:46
Beiträge: 54
So, seit 7 Jahren läuft das so wie oben angezeigt in unserem Programm. Nun haben wir in disem Monat schon mehrere Kunden, die ne neue Radeon-Grafikkarte haben und es läuft nicht mehr (das Bitmap zeigt nur noch den farbigen Hintergrund). Wie kann ich feststellen ob, bzw. festlegen, dass ich die Software-Implementation von Microsoft nutze?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drucken mit OpenGL
BeitragVerfasst: Di Aug 16, 2011 11:16 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
glGetString sollte das passende für dich sein.

Heutzutage würde man dir wohl eher empfehlen in Texturen zu rendern. Die sollten dann auch druckbar sein.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drucken mit OpenGL
BeitragVerfasst: Di Aug 16, 2011 11:51 
Offline
DGL Member

Registriert: Di Sep 28, 2004 15:46
Beiträge: 54
Nun geGetString liefert :
Code:
  1.  
  2. GL_RENDERER  :GDI Generic
  3. GL_VENDOR    :Microsoft Corporation
  4. GL_VERSION   :1.1.0
  5.  


also scheint es daran nicht zu liegen.

edit:
Hab ein wenig dran gearbeitet was damals nicht funktionierte ist der Boardheader, mit der aktuellen Version funktioniert es. Allerdings bringt mich das der Lösung meines Problems nicht näher. Onscreen wird mit der Grafikkarte gerendert, Offscreen mit GDI.
Bedingt PFD_DRAW_TO_BITMAP GDI???


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drucken mit OpenGL
BeitragVerfasst: Mi Aug 17, 2011 10:23 
Offline
DGL Member

Registriert: Di Sep 28, 2004 15:46
Beiträge: 54
Hallo,
hab jetzt das Rendern in die Texturen probiert, aber das funktioniert in meinem Fall nicht, da ich offscreen rendere ohne ein Fernster geöffnet zu haben.

Bin jetzt auch so weit, dass ich sagen kann, dass das Problem z. Zt. nur bei windows 7 mit ATI Radeon HD auftritt.
Was mich jetzt wundert ist, dass das ausgerechnet dann auftritt (in Verbindung mit der Radeon), wenn ich per GDI render...
Hab auch schon mal gedacht unter Windows die Hardwareunterstützung auszuschalten aber auch das hat nichts gebracht.

Hat irgendwer noch ne Idee was ich probieren kann?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Drucken mit OpenGL
BeitragVerfasst: Fr Sep 30, 2011 20:46 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Zu aller erst Mal... Das Ding ist seit 7 Jahren im Einsatz? O.o Krass... Das ist irgendwo cool :)

Wenn du den Spaß aber ausdrucken möchtest... Wieso liest du dann nicht einfach vor dem Drucken mit glReadPixels dein Bild händisch in ein Bitmap oder wohin auch immer und druckst das dann aus? Dann kannst du auch mal ordentliche OpenGL-Implementierungen (wie z.B. die deiner Grafikkarte) nehmen.

Oder du renderst wirklich in ne Textur.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]