OpenGL einbinden

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
gl_programmer
Beiträge: 4
Registriert: 28.02.2009 13:46

Beitrag von gl_programmer »

Hallo zusammen.

Mittlerweile habe ich mich durch haufenweise Tutorials durchgearbeitet und dabei immer wieder das Beispiel im examples-Ordner verändert...

Jetzt habe ich versucht mir mein "eigenes" Programm zu schreiben (natürlich immer noch mit reichlicher Hilfe durch Tutorials), allerdings öffnet sich nur das graue Fenster, das Dreieck wird nicht gezeichnet...

Wäre schön, wenn mir jemand weiterhelfen könnte.

Hier der Code:

Code: Alles auswählen

IncludeFile "OpenGL.pbi"     ;;; OpenGL wird eingebunden

;;;;;;;;;;;;;;;;;;;;;;;;
;;; Vorbereitungen
;;;;;;;;;;;;;;;;;;;;;;;;
pfd.PIXELFORMATDESCRIPTOR     ;;; Das Pixelformat wird definiert
Width  = 800                  ;;; Breite des Fensters
Height = 600                  ;;; Höhe des Fensters
hWnd = OpenWindow(0, 10, 10, Width, Height, "First OpenGL Test")  ;;; Fenster wird geöffnet
hdc = GetDC_(hWnd)      
pfd\nSize        = SizeOf(PIXELFORMATDESCRIPTOR)                  ;;; Größe des Pixelformats
pfd\nVersion     = 1          ;;; Version des Pixelformats
pfd\dwFlags      = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW      ;;; Ünterstützung für OpenGL | Doppelbuffer (SwapBuffers) | Windows
pfd\iPixelType   = #PFD_TYPE_RGBA     ;;; Farbmodus RGB-A
pfd\cColorBits   = 16                 ;;; Farbtiefe
pfd\cDepthBits   = 16                 ;;; 16-Bit Tiefenbuffer
pfd\cStencilBits =0                   ;;; Kein Stencil-Buffer	         
pfd\cAuxBuffers	 =0                   ;;;	Kein Auxiliary-Buffer	
pfd\iLayerType	 = #PFD_MAIN_PLANE    ;;; Haupt-Renderplane
pixformat = ChoosePixelFormat_(hdc, pfd)      ;;; Pixelformat nach obigen Angaben auswählen
hrc = wglCreateContext_(hdc)          ;;; Renderkontext wird erstellt

glViewport_ (0, 0, Width, Height)     ;;; Viewport auf eine Ausgangsposition setzen
glMatrixMode_ (#GL_PROJECTION)        ;;; Den Matrix-Modus Projection wählen
glLoadIdentity_ ()                    ;;; Diesen Modus auf Anfangswerte setzen
gluPerspective_ (45.0, Width/Height, 0.1, 100.0)      ;;; Grundeinstellungen des Anezeigefensters festlegen
glMatrixMode_ (#GL_MODELVIEW)         ;;; Auf den Matrix-Modus Modelview schalten
glLoadIdentity_ ()                    ;;; Auch diesen auf Anfangswerte setzen
glClearColor_ (0.5, 0.5, 0.50, 0.0)   ;;; Setze Farbe für löschen auf Mittelgrau
glClearDepth_ (1.0)                   ;;; Depth-Buffer Löschen erlauben
glEnable_ (#GL_DEPTH_TEST)            ;;; Tiefentest GL_DEPTH_TEST einschalten
glClear_ (#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)   ;;; Tiefen- und Farbpufferbits löschen

;;;;;;;;;;;;;;;;;;;;;;;;
;;; Hauptprogramm
;;;;;;;;;;;;;;;;;;;;;;;;
  While Quit = 0
  Repeat 
    EventID = WindowEvent()
        Select EventID
      Case #PB_Event_CloseWindow
        Quit = 1
    EndSelect
    Until EventID = 0
   glBegin_ (GL_TRIANGLES)
      glColor3f_ (1, 0, 0)
      glVertex3f_ ( 0, 1, -2)
      glColor3f_ (0, 1, 0)
      glVertex3f_ (-1,-1, -2)
      glColor3f_ (0, 0, 1)
      glVertex3f_ ( 1,-1, -2)
  glEnd_()
  SwapBuffers_(hdc)
Wend
  
End
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Code: Alles auswählen

;--------------------------------------------------------------------------------------------------
; Declarations
;--------------------------------------------------------------------------------------------------

EnableExplicit

XIncludeFile "../OpenGL.pbi"

Global ScreenWidth	= 640
Global ScreenHeight	= 480

Global Title.s = "OpenGL"

Global WindowEvent
Global hDC, hRC, Windownumber, WindowRect.RECT, wpos.POINT, hWnd
Global Windowflags
Global PixelFormat ;Holds The Results After Searching For A Match

;--------------------------------------------------------------------------------------------------
; Startup
;--------------------------------------------------------------------------------------------------

WindowRect\left   = 0       ;Set Left Value To 0
WindowRect\right  = ScreenWidth  ;Set Right Value To Requested Width
WindowRect\top    = 0       ;Set Top Value To 0
WindowRect\bottom = ScreenHeight ;Set Bottom Value To Requested Height

Windownumber = OpenWindow(#PB_Any, 0, 0, ScreenWidth, ScreenHeight, Title, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)

hWnd = WindowID(Windownumber)

If hWnd = #False
 MessageRequester("Error", "Window Handle is NULL!")
EndIf

Global pfd.PIXELFORMATDESCRIPTOR
pfd\nSize=SizeOf(PIXELFORMATDESCRIPTOR)
pfd\nVersion=1 ;Version Number
pfd\dwFlags=#PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW ;Format Must Support Window, OpenGL, Double Buffering
pfd\iPixelType=#PFD_TYPE_RGBA
pfd\cColorBits      = 32 ;Select Our Color Depth
pfd\cRedBits        = 0 ;Color Bits Ignored
pfd\cRedShift       = 0
pfd\cGreenBits      = 0
pfd\cGreenShift     = 0
pfd\cBlueBits       = 0
pfd\cBlueShift      = 0
pfd\cAlphaBits      = 0 ;No Alpha Buffer
pfd\cAlphaShift     = 0 ;Shift Bit Ignored
pfd\cAccumBits      = 0 ;No Accumulation Buffer
pfd\cAccumRedBits   = 0 ;Accumulation Bits Ignored
pfd\cAccumGreenBits = 0
pfd\cAccumBlueBits  = 0
pfd\cAccumAlphaBits = 0
pfd\cDepthBits      = 16              ;16Bit Z-Buffer (Depth Buffer)
pfd\cStencilBits    = 0               ;No Stencil Buffer
pfd\cAuxBuffers     = 0               ;No Auxiliary Buffer
pfd\iLayerType      = #PFD_MAIN_PLANE ;Main Drawing Layer
pfd\bReserved       = 0               ;Reserved
pfd\dwLayerMask     = 0               ;Layer Masks Ignored
pfd\dwVisibleMask   = 0
pfd\dwDamageMask    = 0

hDC = GetDC_(hWnd)

If hDC = #False
  MessageBox_(#Null, "Cannot create a OpenGL Device Context!", Title, #MB_OK | #MB_ICONERROR)
  End
EndIf

PixelFormat = ChoosePixelFormat_(hDC, pfd)

If PixelFormat = #False
  MessageBox_(#Null, "Cannot find a suitable PixelFormat!", Title, #MB_OK | #MB_ICONERROR)
  End
EndIf
 
If SetPixelFormat_(hDC, PixelFormat, pfd) = #False
  MessageBox_(#Null, "Cannot set the PixelFormat!", Title, #MB_OK | #MB_ICONERROR)
  End
EndIf
 
hRC = wglCreateContext_(hDC)
 
If hRC = #False
  MessageBox_(#Null, "Cannot Create a OpenGL Rendering Context!", Title, #MB_OK | #MB_ICONERROR)
  End
EndIf
 
If wglMakeCurrent_(hDC, hRC) = #False
  MessageBox_(#Null, "Cannot activate the OpenGL Rendering Context!", Title, #MB_OK | #MB_ICONERROR)
  End
EndIf

ShowWindow_(hWnd, #SW_SHOW) ;Show The Window
SetForegroundWindow_(hWnd) ;Slightly Higher Priority
SetFocus_(hWnd) ;Sets Keyboard Focus To The Window

; Set up OpenGL

glClearColor_(0.0, 0.25, 0.5, 0.0)

glViewport_(0, 0, ScreenWidth, ScreenHeight)

glMatrixMode_(#GL_PROJECTION)
glLoadIdentity_()
gluPerspective_(30.0, ScreenWidth/ScreenHeight, 0.0, 1024.0)
glMatrixMode_(#GL_MODELVIEW)
	
;--------------------------------------------------------------------------------------------------
; Main Loop
;--------------------------------------------------------------------------------------------------

Repeat
	
	Repeat
		
		WindowEvent = WindowEvent()
		
		If WindowEvent = #PB_Event_CloseWindow
			
			End
			
		EndIf
		
	Until WindowEvent = #False
	
	glClear_(#GL_COLOR_BUFFER_BIT)
	glLoadIdentity_()
	
	glTranslatef_(0.0, 0.0, -10.0)
	
	glBegin_(#GL_TRIANGLES)
		
		glVertex2f_(0.0, 0.0)
		glVertex2f_(1.0, 0.0)
		glVertex2f_(0.0, 1.0)
		
	glEnd_()
	
	SwapBuffers_(hDC)
	
ForEver
Ich habe deinen Quelltext nicht berichtigt, sondern hier ist einfach ein kompletter von mir. Deiner war leicht fehlerbehaftet. Da fehlte einiges an Abfragen am Beginn. Dein Schreibstil ist auch nicht sehr übersichtlich, solltest du mal vielleicht etwas aufbessern ;)

Den Tiefentest brauchst du gar nicht.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Antworten