OGL auf WindowedScreen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

OGL auf WindowedScreen?

Beitrag von FGK »

Hallo Leute,

hab heute ein wenig mit OpenGL experimentiert. Dabei wollte ich es schaffen die OGL Ausgabe auf einem WindowedScreen auszugeben. Leider ist mir das misslungen. Es wird immer die ganze ClientArea des Windows benutzt obwohl ich den hwnd und dc des Screens übergeben habe.
Liegst an den Flags? Das Grüne im Fenster ist der Render-DC von OGL
das Schwarze ist er WindowedScreen. Wenn das nicht gehen sollte (der Verdacht beschleicht mich langsam) dann wäre es wenigstens schön wenn
ich den RenderDC von OGL auf ein von mir bestimmtes Rect beschränken könnte, so daß er nicht immer das ganze Window einnimmt.
Ideen dazu?

Gruß FGK

Code: Alles auswählen

; OpenGL Fenster 
; 
IncludeFile "OpenGL.pbi"

;Fenstereigenschaften 
#WindowWidth = 1024 
#WindowHeight = 800 
#WindowFlags = #PB_Window_TitleBar | #PB_Window_MaximizeGadget | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered 

Global hwnd.l 

Procedure MyWindowCallback(WindowID, message, wParam, lParam) 
  Result = #PB_ProcessPureBasicEvents 
  If message = #WM_SIZE 
    glViewport_(0, 0, WindowWidth(), WindowHeight()) ;OpenGL an die Fenstergröße anpassen 
    Result = 1 
  EndIf 
  ProcedureReturn Result 
EndProcedure 

InitSprite()
If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight, #WindowFlags, "OGL Test")  
  hwnd= OpenWindowedScreen(WindowID(),10,10,800,600,0,10,10) 
  SetWindowCallback(@MyWindowCallback()) 
  
  hwnd = ScreenID()  
  pfd.PIXELFORMATDESCRIPTOR  
  hdc = GetDC_(hwnd) 
  pfd\nSize = SizeOf(PIXELFORMATDESCRIPTOR) 
  pfd\nVersion = 1 
  pfd\dwFlags = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW 
  pfd\iLayerType = #PFD_MAIN_PLANE 
  pfd\iPixelType = #PFD_TYPE_RGBA 
  pfd\cColorBits = 24  
  pfd\cDepthBits = 16  
  pixformat = ChoosePixelFormat_(hdc, pfd) 
  SetPixelFormat_(hdc, pixformat, pfd) 
  hrc = wglCreateContext_(hdc) 
  wglMakeCurrent_(hdc, hrc) 
  SwapBuffers_(hdc) 
  glClearColor_(0.0, 1.0, 0.0, 1.0)
  
  Repeat 
    glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)  
    SwapBuffers_(hdc) 
    FlipBuffers()
    ClearScreen(0,0,0)
    Event = WaitWindowEvent() 
  Until Event = #PB_Event_CloseWindow 
  End 
EndIf
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: OGL auf WindowedScreen?

Beitrag von Danilo »

FGK hat geschrieben:Wenn das nicht gehen sollte (der Verdacht beschleicht mich langsam)
Wieso willst Du überhaupt einen GL-Screen über einem
DX-Screen darstellen?
FGK hat geschrieben:dann wäre es wenigstens schön wenn ich den RenderDC von
OGL auf ein von mir bestimmtes Rect beschränken könnte,
so daß er nicht immer das ganze Window einnimmt.
ScreenID() liefert das Handle des Fensters zurück auf
dem der Screen ist.
Deshalb ist es auch über das ganze Fenster gegangen.
FGK hat geschrieben:Ideen dazu?
Nimm einen Container und lege nicht einen GL-Screen über den
DX-Screen. Nebeneinander verwenden sollte OK sein, aber
übereinander bringt nichts.

Code: Alles auswählen

; OpenGL Fenster
;
IncludeFile "OpenGL.pbi"

;Fenstereigenschaften
#WindowWidth = 1024
#WindowHeight = 800
#WindowFlags = #PB_Window_Invisible | #PB_Window_MaximizeGadget | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered

Structure GLscreen
  container.l
  hWnd.l
  hDC.l
EndStructure 

Procedure OpenGLScreen(*p.GLscreen,x,y,w,h)
  If *p
    container = ContainerGadget(#PB_Any,x,y,w,h)
    If container
      hwnd = GadgetID(container)
      pfd.PIXELFORMATDESCRIPTOR 
      hdc = GetDC_(hwnd)
      pfd\nSize = SizeOf(PIXELFORMATDESCRIPTOR)
      pfd\nVersion = 1
      pfd\dwFlags = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW
      pfd\iLayerType = #PFD_MAIN_PLANE
      pfd\iPixelType = #PFD_TYPE_RGBA
      pfd\cColorBits = 24 
      pfd\cDepthBits = 16 
      pixformat = ChoosePixelFormat_(hdc, pfd)
      SetPixelFormat_(hdc, pixformat, pfd)
      hrc = wglCreateContext_(hdc)
      wglMakeCurrent_(hdc, hrc)
      SwapBuffers_(hdc)
      glClearColor_(0.0, 1.0, 0.0, 1.0)
      *p\container = container
      *p\hWnd      = GadgetID(container)
      *p\hDC       = hdc
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight, #WindowFlags, "OGL Test") 
  CreateGadgetList(WindowID())
  If OpenGLScreen(screen.GLscreen,10,10,800,600)

    HideWindow(0,0)

    Repeat
      glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT) 
      SwapBuffers_(screen\hdc)
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow

    ReleaseDC_(screen\hWnd,screen\hDC)

  EndIf

EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Beitrag von FGK »

Danke Danilo,

Wie immer ein perfektes Posting!
Gestern abend im Bett ist mir die Sache nochmals durch den Kopf gegangen. Warum bin ich nicht selber draufgekommen das der Screen eigentlich ne DX-Surface ist und nix mit OGL am Hut hat. Mensch!
Aber die Sache mit dem Container ist klasse, damit kann man schön
die Größe und Lage Ausgabefläche kontrollieren. Hintergrund ist folgender, ich will mit OGL die 3D-Grafikausgabe machen und im restlichen Fenster das ganze GUI per Gadgets lösen. Bin dahingehend durch deinen Hinweis ein gutes Stück näher gekommen.

Gruß

FGK
Antworten