Das OFFIZIELLE PROFAN SUPPORT FORUM
Einsteigerfragen
PROFAN-Programmierung
Helfer & Tools
Anregungen & Vorschläge
PROFAN-NEWS
Die Regeln!
1 - Einsteigerfragen

 Neues Thema  |  Zur Übersicht  |  Suchen  |  Einloggen   Neuerer Beitrag  |  Älteres Thema 
 OGL + Bitmap
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   23.06.15 17:40

Ich möchte gerne OGL-Scenen, die auf einem
Static-Control sind, als einzelne Bitmap anzeigen
bzw. speichern.
Die Objekte sind natürlich starr.

 Declare Handle bmp1, bmp2, st
 Declare Int ende
 
 WindowTitle "Fenster"
 Window 800, 640
 st = @Create("Static", %Hwnd, 10, 20, 200, 100)
 oGL("Init", st, 0, 0, 0, 0)
 DrawGlScene()
 ShowBmp()
 
 ende = 0
 WhileNot ende
   WaitInput
 
   Case %Key = 2 : ende = 1
 EndWhile
 
 OGL("Done")
 DeleteObject bmp1
 End
 
 Proc ShowBmp
 bmp1 = @Create("hSizedPic", 0, "&OGLBMP", 200, 100, 0)
 'SavePic "G:\OGL.BMP", bmp1
 DrawPic bmp1, 10, 150;0
 EndProc
 
 Proc DrawGLScene
   oGL("Clear")
   oGL("Origin", -1.5, -1.5, -6.0)
   oGL("Sphere", 1.5, 32, 32)
   oGL("Show")
 EndProc
 


Hier bekomme ich aber nur die graue Fläche des Static-Controls.
Weiß jemand Rat ?
Die entstandenen Bitmaps will ich später in einer ImageListe
verwalten.

H.Brill
XProfan X4 + FreeProfan

Nachricht bearbeitet (23.06.15 17:41)

Beitrag beantworten
 
 Re: OGL + Bitmap
Autor: David Strutz (---.dip0.t-ipconnect.de)
Datum:   26.06.15 20:39

Gib mal in der Hilfe unter Suche ein: &oglbmp



XProfan & FreeProfan rox: http://xprofan.net/



Beitrag beantworten
 
 Re: OGL + Bitmap
Autor: RGH (---.hsi.kabel-badenwuerttemberg.de)
Datum:   27.06.15 02:41

Das Problem hängt mit dem Pixelformat von OpenGL zusammen, das je nach Hardware unterschiedlich ist und sich dann in manchen Fällen nicht so einfach aus dem Devicecontext herauskopieren lässt.
Aber ich habe eine Lösung gefunden:
Mir ist aufgefallen, dass bei &DSKBMP, wenn der ganze Bildschirm kopiert wird, das OGL-Fenster auch korrekt mit Inhalt gezeigt wird.*
Also kopiere ich jetzt bei &OGLBMP aus dem Desktop-Devicekontext den Teil heraus, der das OpenGL-Fenster zeigt. Und schon geht es auch auf meinem Rechner, auf dem es bislang nicht ging!
In der endgültigen Version X3 wird das dann hoffentlich mit den allermeisten Grafikkarten funktionieren.

*Bis dahin ein Workaround: Statt &OGLBMP einfach &DSKBMP verwenden und aus dem Bild den entsprechen Teil herauskopieren (oder das OGL-Fenster maximieren).

Gruß
Roland

Offizielle Homepage: http://www.xprofan.de
Der neue PROFAN-FAN-SHOP: http://www.spreadshirt.de/shop.php?sid=9330
Das kostenlose Kartenspiel: http://www.rgh-soft.de/sprace/sprace.htm

Beitrag beantworten
 
 Re: OGL + Bitmap
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   27.06.15 09:27

Welche Profan-Version hast du denn ?
Also, bei der aktuellen und der X3 finde
ich keine Systemvariable &oglbmp.

Die kann man nur als interner Resourcen-Name
bei den Funktionen Create("hPic", ..) und
Create("hSizedPic",..) angeben. Und da hat
es ja bei mir nicht funktioniert.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: OGL + Bitmap
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   27.06.15 09:46

Das Problem ist aber, außer der Rechnerei,
daß der Hintergrund durchscheint.
 bmp1 = @Create("hPic", 0, "&DSKBMP")
 CopyPic bmp1, 260, 250 - 200, 100 > 10, 200; 0
 


Im Interpreter z.B. sieht man den Quellcode
im Bild. Ansonsten das, was gerade drunter
liegt.

Oder muß man da noch was einstellen ?

Deswegen war ja an andere Stelle meine Idee, die
OGL-Ausgaben auf eine Speicherbitmap umzuleiten.
Halt sowas ähnliches wie Startpaint -1 ...EndPaint.

So eine Speicherbitmap hat ja von Hause aus keine
Hintergrundfarbe. Hilfreich wäre dann auch, wenn
man das Handle der Bitmap (von MCls) als System
variable hätte. Den DC hast du ja auch als Systemvariable.

H.Brill
XProfan X4 + FreeProfan

Nachricht bearbeitet (27.06.15 10:03)

Beitrag beantworten
 
 Re: OGL + Bitmap
Autor: David Strutz (---.dip0.t-ipconnect.de)
Datum:   28.06.15 19:59

RGH schrieb:


> Aber ich habe eine Lösung gefunden:
> ... &DSKBMP

Och nö! Das hieße dass darüber liegende Fenster mitkopiert werden und
man kann dann kein OGL im Hintergrund haben um es erst nachträglich
auf den Schirm zu bringen und/ oder um nachträglich Pixeleffekte drüber zu
legen.

Das OGL-Bild muss schon richtig abgreifbar sein auch ohne dass es sichtbar
ist! Pixelarray wäre natürlich auch OK.



XProfan & FreeProfan rox: http://xprofan.net/



Beitrag beantworten
 
 Re: OGL + Bitmap
Autor: RGH (---.hsi.kabel-badenwuerttemberg.de)
Datum:   28.06.15 22:12

Wenn ich eine Möglichkeit fände, die es ermöglicht. So ist es aber vorläufig erst einmal brauchbar, auch wenn man darauf achten muss, das nichts davor ist.

Vielleicht findet ich ja irgendwann eine andere Lösung. Ich hatte zwar eine Kombination bei Pixelformat, die ein direktes Kopieren (wie bisher) erlaubte, aber da kam ich auf meinem Rechner nicht über 2 Bilder pro Sekunde heraus, also ein Tempolverlust auf unter 1% des normalen Tempos.

Kurz: Es bleibt erst einmal bei dem %DeskTop-Umweg.

Gruß
Roland

Offizielle Homepage: http://www.xprofan.de
Der neue PROFAN-FAN-SHOP: http://www.spreadshirt.de/shop.php?sid=9330
Das kostenlose Kartenspiel: http://www.rgh-soft.de/sprace/sprace.htm

Beitrag beantworten
 
 Re: OGL + Bitmap
Autor: peter (---.pools.arcor-ip.net)
Datum:   18.04.16 09:10

Ja es ist schon älter hier mit der OGL-Spielerei, aber ich bringe meine Lösung einmal. Ich habe ein Oglfenster 128x128 im XProfan-Screen gemacht und da packe ich eine BMP rein mit 64x64. Ich habe 2 BMP die ich mit den Tasten A und Y wechseln kann darin. Mit den Tasten QWSE kann ich das gegrabte Bild dann im Spielefenster als Sprite benutzen. Mir fällt nur auf, bevor ich das Spielefenster sehe, muss ich das XProfan-Fenster mit der Maus etwas bewegen, ist aber ein anderes Problem. Auch wenn man das OGL-Fenster unsichtbar macht bzw außerhalb des sichtbaren Bereiches schiebt , kann man noch immer grabben. Dazu wird noch die Dib.dll gebraucht von Frank:
http://www.rgh-soft.de/forum01/read.php?f=7&i=15786&t=15780

Damit ist das Ogl-Fenster unsichtbar bzw außerhalb des Bereiches:
hWin& = Control(Trim$(ClassName$), "", $50000000, -150, 10, 128, 128, %HWnd, 0, %HInstance)

hier die -150

 declare hWin&,hintergrpic&,vordergrpic&
  declare ende&,winkel!,groesse&,dib&,array&
  declare bild_auto&,auto1&,auto11&,pi180!
  declare bmi#,ogl_rgb#
  declare x1!,y1!,dx!,dy!
  Declare ClassName$
  
  Def &GL_BGR $80E0
  DEF CreateDIB(2) !"dib","CreateDIB"
  DEF FreeDIB(1) !"dib","FreeDIB"
  DEF DrawDIB(4) !"dib","DrawDIB"
  DEF CloneDIB(1) !"dib","CloneDIB"
  dib&=usedll("dib.dll")
 
  hintergrpic& = create("hNewPic", 400,400,rgb(255,255,0))
  vordergrpic& = create("hNewPic", 400,400,rgb(255,255,0))
  bild_auto& = create("hNewPic", 128,128,rgb(255,255,0))
  
  Pi180!=0.0174532925199433
  ende&=1
  array&=CreateDIB(128,128)
  groesse&=128*128*4
  dim ogl_rgb#,groesse&
  
  startpaint hintergrpic&
    UsePen 0,1,Rgb(0,255,0)
    usebrush 1,rgb(0,255,0)
    ellipse 150,150-250,250
  endpaint
 
  Window 20,20-800,600
  Cls RGB(220,220,220)
 
  ClassName$ = "Fenster"
  External("User32", "GetClassNameA", %HWnd, ClassName$, 64)
  hWin& = Control(Trim$(ClassName$), "", $50000000, 10, 10, 128, 128, %HWnd, 0, %HInstance)
  
  oGL("Init",hwin&,0,0,0,0)
  oGL("PosMode", 1)
 
  auto1&=oGL("LoadTextureBMP","d:/xprofan/data/auto1.bmp",1)
  auto11&=oGL("LoadTextureBMP","d:/xprofan/data/auto11.bmp",1)
 
  OGL("Clear")
  OGL("texture",auto1&,1)
  
  drawglscene
  drawglscene
  zeichne
  
  WHILE ende&
    if isKey(89)
      OGL("texture",auto1&,1)
      drawglscene
      zeichne
    ElseIf Iskey(65)
      OGL("texture",auto11&,1)
      drawglscene
      zeichne
    EndIf
      
    if isKey(87)
       y1!=Sin(-winkel!*Pi180!)*0.3
       x1!=Cos(-winkel!*Pi180!)*0.3
       dx!=dx!-x1!
       dy!=dy!-y1!
       zeichne
     Elseif isKey(83)
       y1!=Sin(-winkel!*Pi180!)*0.3
       x1!=Cos(-winkel!*Pi180!)*0.3
       dx!=dx!+x1!
       dy!=dy!+y1!
       zeichne
     endif
 
    if isKey(81)
      winkel!=winkel!+0.5
      drawglscene
      zeichne
    Elseif isKey(69)
      winkel!=winkel!-0.5
      drawglscene
      zeichne
    EndIf
  EndWhile
  FreeDIB(array&)
  end
 
  Proc zeichne
   StartPaint vordergrpic&
     DrawPic hintergrpic&,0,0;0
     drawpic bild_auto&,50+dx!,50+dy!;-1
   EndPaint
   DrawPic vordergrpic&, 300,50;0
  EndProc
  
  proc drawglscene
    OGL("quad",0.5,0.5)
    OGL("origin",0,0,-1.2)
  	 OGL("rotate",0,0,winkel!)
    OGL("show")
    ogl("glReadPixels",0,0,128,128,&GL_BGR, ~GL_UNSIGNED_BYTE,ogl_rgb#)
    setDIBits(%hdc,bild_auto&,0,128,ogl_rgb#,array&,0)
  endproc
 




Nachricht bearbeitet (18.04.16 09:18)

Beitrag beantworten
 Foren-Liste  |  Baumstruktur   Neuerer Beitrag  |  Älteres Thema 


 Foren-Liste  |  Zur Registrierung 
 Benutzerlogin
 Benutzername:
 Passwort:
 Login-Daten speichern:
   
 Passwort vergessen?
E-Mail-Adresse oder Username unten eingeben. Dann wird Dir per e-Mail ein neues Passwort zugeschickt.

phorum.org