OpenGL-lernen
OpenGL-lernen
Hi,
Ich bin gerade dabei OpenGL zu lernen und hab da noch ein paar Probleme...
Gibts da tutorials? Die die ich gefunden habe bringen mir nicht viel...
Danke schonmal!
Ich bin gerade dabei OpenGL zu lernen und hab da noch ein paar Probleme...
Gibts da tutorials? Die die ich gefunden habe bringen mir nicht viel...
Danke schonmal!
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
FAQ Bereich.
http://www.purebasic.fr/german/viewtopic.php?t=27
http://www.purebasic.fr/german/viewtopic.php?t=8758
http://www.purebasic.fr/german/viewtopic.php?t=27
http://www.purebasic.fr/german/viewtopic.php?t=8758
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Die besten/bekanntesten Tuts sind die von Nehe.
Einfach im englischem Forum suchen "OpenGL" "Tips & Tricks"
49 Treffer!
Desweiteren sind hier im Board auch noch welche von denen, die
Nikolaus an PB angepaßt hat.
Suchen will gelernt sein
Gruß
Thomas
Einfach im englischem Forum suchen "OpenGL" "Tips & Tricks"
49 Treffer!
Desweiteren sind hier im Board auch noch welche von denen, die
Nikolaus an PB angepaßt hat.
Suchen will gelernt sein

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Empfehlen kann man auch das Buch "Beginning OpenGL Game Programming". Ein Blick ins OpenGL RedBook ist auch nicht verkehrt. Das gab es glaube ich kostenlos irgendwo auf der sgi Seite, wenn auch für die veraltete Version 1.1. Beides allerdings auf Englisch und selbstverständlich ohne PureBasic beispiele.
Danke für alle links und Tipps!
Ich hab da noch ein paar Fragen;
1. was macht glTexCoord2f_()? <- Ich weis nur das das irgendetwas mit den Bild zu tun hat das man auf sein Objekt malen will...
2. wie kann ich bei diesem code eine richtige ego-ansicht machen (also mit maus und tastatur...)? Ich hab bis jetzt nur mit der Tastatur alles gemacht...
[Aus dem englischem forum...]
3. Kann mann ein Objekt alleine Drehen, oder geht das nur mit der ganzen Welt?
[Edit]Eine Frage noch...
4. Kann ich auch Anti-Aliasing in OpenGL einschalten oder geht das nur mit DX? oder gibts vielleicht noch eine Möglichkeit?
Danke schonmal!
Ich hab da noch ein paar Fragen;
1. was macht glTexCoord2f_()? <- Ich weis nur das das irgendetwas mit den Bild zu tun hat das man auf sein Objekt malen will...
2. wie kann ich bei diesem code eine richtige ego-ansicht machen (also mit maus und tastatur...)? Ich hab bis jetzt nur mit der Tastatur alles gemacht...
Code: Alles auswählen
;NeHe's Textures, Lighting & Keyboard Tutorial (Lesson 7)
;http://nehe.gamedev.net
;Credits: Nico Gruener, Dreglor, traumatic
;Author: hagibaba
;Date: 5 Jan 2007
;Note: up-to-date with PB v4.02 (Windows)
;Note: requires a bitmap in path "Data/Crate.bmp"
;Section for standard constants, structures, macros and declarations
XIncludeFile "includes\OpenGL.pbi" ;include the gl.h constants
;wingdi.h constants
#DM_BITSPERPEL=$40000
#DM_PELSWIDTH=$80000
#DM_PELSHEIGHT=$100000
;winuser.h constants
#CDS_FULLSCREEN=4
#DISP_CHANGE_SUCCESSFUL=0
#SC_MONITORPOWER=$F170
Structure AUX_RGBImageRec ;glaux.h structure
sizeX.l : sizeY.l
Data.l
EndStructure
Procedure.w LoWord(value.l) ;windef.h macro
ProcedureReturn (value & $FFFF)
EndProcedure
Procedure.w HiWord(value.l) ;windef.h macro
ProcedureReturn ((value >> 16) & $FFFF)
EndProcedure
;glaux.lib symbols
!public ___ftoll
!___ftoll dw 0
!public __imp__wsprintfA
!__imp__wsprintfA dw 0
Import "glu32.lib"
gluPerspective(fovy.d,aspect.d,zNear.d,zFar.d) ;sets up a perspective projection matrix
EndImport
Import "opengl32.lib"
glClearDepth(depth.d) ;specifies the clear value for the depth buffer
EndImport
;Start of Lesson 7
Global hDC.l ;Private GDI Device Context
Global hRC.l ;Permanent Rendering Context
Global hWnd.l ;Holds Our Window Handle
Global hInstance.l ;Holds The Instance Of The Application
Global Dim keys.b(256) ;Array Used For The Keyboard Routine
Global active.b=#True ;Window Active Flag Set To TRUE By Default
Global fullscreen.b=#True ;Fullscreen Flag Set To Fullscreen Mode By Default
Global light.b ;Lighting ON/OFF ( NEW )
Global lp.b ;L Pressed? ( NEW )
Global fp.b ;F Pressed? ( NEW )
Global x.f=0 ;left right move
Global xrot.f ;X Rotation
Global yrot.f ;Y Rotation
Global xspeed.f ;X Rotation Speed
Global yspeed.f ;Y Rotation Speed
Global z.f=-5.0 ;Depth Into The Screen
Global MouseX.f
Global MouseY.f
Global Dim LightAmbient.f(4) ;Ambient Light Values ( NEW )
LightAmbient(0)=0.5 ;red
LightAmbient(1)=0.5 ;green
LightAmbient(2)=0.5 ;blue
LightAmbient(3)=1.0 ;alpha
Global Dim LightDiffuse.f(4) ;Diffuse Light Values ( NEW )
LightDiffuse(0)=1.0 ;red
LightDiffuse(1)=1.0 ;green
LightDiffuse(2)=1.0 ;blue
LightDiffuse(3)=1.0 ;alpha
Global Dim LightPosition.f(4) ;Light Position ( NEW )
LightPosition(0)=0.0 ;x
LightPosition(1)=0.0 ;y
LightPosition(2)=2.0 ;z
LightPosition(3)=1.0 ;w
Global filter.l ;Which Filter To Use
Global Dim texture.l(3) ;Storage For 3 Textures
Declare.l WndProc(hWnd.l,uMsg.l,wParam.l,lParam.l) ;Declaration For WndProc
Procedure.l LoadBMP(Filename.s) ;Loads A Bitmap Image
Protected File.l=#Null ;File Handle
If Filename="" ;Make Sure A Filename Was Given
ProcedureReturn #Null ;If Not Return NULL
EndIf
File=ReadFile(#PB_Any,Filename) ;Check To See If The File Exists
If File ;Does The File Exist?
CloseFile(File) ;Close The Handle
ProcedureReturn auxDIBImageLoad(Filename) ;Load The Bitmap And Return A Pointer
EndIf
ProcedureReturn #Null ;If Load Failed Return NULL
EndProcedure
Procedure.l LoadGLTextures() ;Load Bitmaps And Convert To Textures
Protected Status.l=#False ;Status Indicator
Protected Dim *TextureImage.AUX_RGBImageRec(1) ;Create Storage Space For The Texture
;Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
*TextureImage(0)=LoadBMP("Data/Crate.bmp")
If *TextureImage(0)
Status=#True ;Set The Status To TRUE
glGenTextures_(3,@texture(0)) ;Create Three Textures
;Create Nearest Filtered Texture
glBindTexture_(#GL_TEXTURE_2D,texture(0))
glTexParameteri_(#GL_TEXTURE_2D,#GL_TEXTURE_MAG_FILTER,#GL_NEAREST)
glTexParameteri_(#GL_TEXTURE_2D,#GL_TEXTURE_MIN_FILTER,#GL_NEAREST)
glTexImage2D_(#GL_TEXTURE_2D,0,3,*TextureImage(0)\sizeX,*TextureImage(0)\sizeY,0,#GL_RGB,#GL_UNSIGNED_BYTE,*TextureImage(0)\Data)
;Create Linear Filtered Texture
glBindTexture_(#GL_TEXTURE_2D,texture(1))
glTexParameteri_(#GL_TEXTURE_2D,#GL_TEXTURE_MAG_FILTER,#GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D,#GL_TEXTURE_MIN_FILTER,#GL_LINEAR)
glTexImage2D_(#GL_TEXTURE_2D,0,3,*TextureImage(0)\sizeX,*TextureImage(0)\sizeY,0,#GL_RGB,#GL_UNSIGNED_BYTE,*TextureImage(0)\Data)
;Create MipMapped Texture
glBindTexture_(#GL_TEXTURE_2D,texture(2))
glTexParameteri_(#GL_TEXTURE_2D,#GL_TEXTURE_MAG_FILTER,#GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D,#GL_TEXTURE_MIN_FILTER,#GL_LINEAR_MIPMAP_NEAREST)
gluBuild2DMipmaps_(#GL_TEXTURE_2D,3,*TextureImage(0)\sizeX,*TextureImage(0)\sizeY,#GL_RGB,#GL_UNSIGNED_BYTE,*TextureImage(0)\Data)
EndIf
If *TextureImage(0) ;If Texture Exists
If *TextureImage(0)\Data ;If Texture Image Exists
FreeMemory(*TextureImage(0)\Data) ;Free The Texture Image Memory
EndIf
FreeMemory(*TextureImage(0)) ;Free The Image Structure
EndIf
ProcedureReturn Status ;Return The Status
EndProcedure
Procedure ReSizeGLScene(width.l,height.l) ;Resize And Initialize The GL Window
If height=0 : height=1 : EndIf ;Prevent A Divide By Zero Error
glViewport_(0,0,width,height) ;Reset The Current Viewport
glMatrixMode_(#GL_PROJECTION) ;Select The Projection Matrix
glLoadIdentity_() ;Reset The Projection Matrix
gluPerspective(45.0,Abs(width/height),0.1,100.0) ;Calculate The Aspect Ratio Of The Window
glMatrixMode_(#GL_MODELVIEW) ;Select The Modelview Matrix
glLoadIdentity_() ;Reset The Modelview Matrix
EndProcedure
Procedure.l InitGL() ;All Setup For OpenGL Goes Here
If LoadGLTextures()=0 ;Jump To Texture Loading Routine
ProcedureReturn #False ;If Texture Didn't Load Return FALSE
EndIf
glEnable_(#GL_TEXTURE_2D) ;Enable Texture Mapping
glShadeModel_(#GL_SMOOTH) ;Enable Smooth Shading
glClearColor_(0.0,0.0,0.0,0.5) ;Black Background
glClearDepth(1.0) ;Depth Buffer Setup
glEnable_(#GL_DEPTH_TEST) ;Enables Depth Testing
glDepthFunc_(#GL_LEQUAL) ;The Type Of Depth Testing To Do
glHint_(#GL_PERSPECTIVE_CORRECTION_HINT,#GL_NICEST) ;Really Nice Perspective Calculations
glLightfv_(#GL_LIGHT1,#GL_AMBIENT,LightAmbient()) ;Setup The Ambient Light
glLightfv_(#GL_LIGHT1,#GL_DIFFUSE,LightDiffuse()) ;Setup The Diffuse Light
glLightfv_(#GL_LIGHT1,#GL_POSITION,LightPosition()) ;Position The Light
glEnable_(#GL_LIGHT1) ;Enable Light One
ProcedureReturn #True ;Initialization Went OK
EndProcedure
Procedure.l DrawGLScene() ;Here's Where We Do All The Drawing
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT) ;Clear The Screen And The Depth Buffer
glLoadIdentity_() ;Reset The View
glTranslatef_(x,0.0,z) ;Translate Into/Out Of The Screen By z
glRotatef_(xrot,1.0,0.0,0.0) ;Rotate On The X Axis By xrot
glRotatef_(yrot,0.0,1.0,0.0) ;Rotate On The Y Axis By yrot
glBindTexture_(#GL_TEXTURE_2D,texture(filter)) ;Select A Texture Based On filter
glBegin_(#GL_QUADS) ;Start Drawing Quads
;Front Face
glNormal3f_( 0.0, 0.0, 1.0) ;Normal Pointing Towards Viewer
glTexCoord2f_(0.0, 0.0) : glVertex3f_(-1.0,-1.0, 1.0) ;Point 1 (Front)
glTexCoord2f_(1.0, 0.0) : glVertex3f_( 1.0,-1.0, 1.0) ;Point 2 (Front)
glTexCoord2f_(1.0, 1.0) : glVertex3f_( 1.0, 1.0, 1.0) ;Point 3 (Front)
glTexCoord2f_(0.0, 1.0) : glVertex3f_(-1.0, 1.0, 1.0) ;Point 4 (Front)
;Back Face
glNormal3f_( 0.0, 0.0,-1.0) ;Normal Pointing Away From Viewer
glTexCoord2f_(1.0, 0.0) : glVertex3f_(-1.0,-1.0,-1.0) ;Point 1 (Back)
glTexCoord2f_(1.0, 1.0) : glVertex3f_(-1.0, 1.0,-1.0) ;Point 2 (Back)
glTexCoord2f_(0.0, 1.0) : glVertex3f_( 1.0, 1.0,-1.0) ;Point 3 (Back)
glTexCoord2f_(0.0, 0.0) : glVertex3f_( 1.0,-1.0,-1.0) ;Point 4 (Back)
;Top Face
glNormal3f_( 0.0, 1.0, 0.0) ;Normal Pointing Up
glTexCoord2f_(0.0, 1.0) : glVertex3f_(-1.0, 1.0,-1.0) ;Point 1 (Top)
glTexCoord2f_(0.0, 0.0) : glVertex3f_(-1.0, 1.0, 1.0) ;Point 2 (Top)
glTexCoord2f_(1.0, 0.0) : glVertex3f_( 1.0, 1.0, 1.0) ;Point 3 (Top)
glTexCoord2f_(1.0, 1.0) : glVertex3f_( 1.0, 1.0,-1.0) ;Point 4 (Top)
;Bottom Face
glNormal3f_( 0.0,-1.0, 0.0) ;Normal Pointing Down
glTexCoord2f_(1.0, 1.0) : glVertex3f_(-1.0,-1.0,-1.0) ;Point 1 (Bottom)
glTexCoord2f_(0.0, 1.0) : glVertex3f_( 1.0,-1.0,-1.0) ;Point 2 (Bottom)
glTexCoord2f_(0.0, 0.0) : glVertex3f_( 1.0,-1.0, 1.0) ;Point 3 (Bottom)
glTexCoord2f_(1.0, 0.0) : glVertex3f_(-1.0,-1.0, 1.0) ;Point 4 (Bottom)
;Right face
glNormal3f_( 1.0, 0.0, 0.0) ;Normal Pointing Right
glTexCoord2f_(1.0, 0.0) : glVertex3f_( 1.0,-1.0,-1.0) ;Point 1 (Right)
glTexCoord2f_(1.0, 1.0) : glVertex3f_( 1.0, 1.0,-1.0) ;Point 2 (Right)
glTexCoord2f_(0.0, 1.0) : glVertex3f_( 1.0, 1.0, 1.0) ;Point 3 (Right)
glTexCoord2f_(0.0, 0.0) : glVertex3f_( 1.0,-1.0, 1.0) ;Point 4 (Right)
;Left Face
glNormal3f_(-1.0, 0.0, 0.0) ;Normal Pointing Left
glTexCoord2f_(0.0, 0.0) : glVertex3f_(-1.0,-1.0,-1.0) ;Point 1 (Left)
glTexCoord2f_(1.0, 0.0) : glVertex3f_(-1.0,-1.0, 1.0) ;Point 2 (Left)
glTexCoord2f_(1.0, 1.0) : glVertex3f_(-1.0, 1.0, 1.0) ;Point 3 (Left)
glTexCoord2f_(0.0, 1.0) : glVertex3f_(-1.0, 1.0,-1.0) ;Point 4 (Left)
glEnd_() ;Done Drawing Quads
xrot+xspeed ;Add xspeed To xrot
yrot+yspeed ;Add yspeed To yrot
ProcedureReturn #True ;Keep Going
EndProcedure
Procedure KillGLWindow() ;Properly Kill The Window
If fullscreen ;Are We In Fullscreen Mode?
ChangeDisplaySettings_(#Null,0) ;If So Switch Back To The Desktop
ShowCursor_(#True) ;Show Mouse Pointer
EndIf
If hRC ;Do We Have A Rendering Context?
If wglMakeCurrent_(#Null,#Null)=0 ;Are We Able To Release The DC And RC Contexts?
MessageBox_(#Null,"Release Of DC And RC Failed.","SHUTDOWN ERROR",#MB_OK | #MB_ICONINFORMATION)
EndIf
If wglDeleteContext_(hRC)=0 ;Are We Able To Delete The RC?
MessageBox_(#Null,"Release Rendering Context Failed.","SHUTDOWN ERROR",#MB_OK | #MB_ICONINFORMATION)
EndIf
hRC=#Null ;Set RC To NULL
EndIf
If hDC And ReleaseDC_(hWnd,hDC)=0 ;Are We Able To Release The DC
MessageBox_(#Null,"Release Device Context Failed.","SHUTDOWN ERROR",#MB_OK | #MB_ICONINFORMATION)
hDC=#Null ;Set DC To NULL
EndIf
If hWnd And DestroyWindow_(hWnd)=0 ;Are We Able To Destroy The Window?
MessageBox_(#Null,"Could Not Release hWnd.","SHUTDOWN ERROR",#MB_OK | #MB_ICONINFORMATION)
hWnd=#Null ;Set hWnd To NULL
EndIf
If UnregisterClass_("OpenGL",hInstance)=0 ;Are We Able To Unregister Class
MessageBox_(#Null,"Could Not Unregister Class.","SHUTDOWN ERROR",#MB_OK | #MB_ICONINFORMATION)
hInstance=#Null ;Set hInstance To NULL
EndIf
EndProcedure
;This Code Creates Our OpenGL Window. Parameters Are:
;title - Title To Appear At The Top Of The Window
;width - Width Of The GL Window Or Fullscreen Mode
;height - Height Of The GL Window Or Fullscreen Mode
;bits - Number Of Bits To Use For Color (8/16/24/32)
;fullscreenflag - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE)
Procedure.b CreateGLWindow(title.s,width.l,height.l,bits.l,fullscreenflag.b)
Global WinWidth
Global WindHeight
Protected PixelFormat.l ;Holds The Results After Searching For A Match
Protected wc.WNDCLASS ;Windows Class Structure
Protected dwExStyle.l ;Window Extended Style
Protected dwStyle.l ;Window Style
Protected WindowRect.RECT ;Grabs Rectangle Upper Left / Lower Right Values
Protected wpos.POINT ;Window position
WindowRect\left=0 ;Set Left Value To 0
WindowRect\right=width ;Set Right Value To Requested Width
WindowRect\top=0 ;Set Top Value To 0
WindowRect\bottom=height ;Set Bottom Value To Requested Height
fullscreen=fullscreenflag ;Set The Global Fullscreen Flag
hInstance=GetModuleHandle_(#Null) ;Grab An Instance For Our Window
wc\style=#CS_HREDRAW | #CS_VREDRAW | #CS_OWNDC ;Redraw On Size, And Own DC For Window
wc\lpfnWndProc=@WndProc() ;WndProc Handles Messages
wc\cbClsExtra=0 ;No Extra Window Data
wc\cbWndExtra=0 ;No Extra Window Data
wc\hInstance=hInstance ;Set The Instance
wc\hIcon=LoadIcon_(#Null,#IDI_WINLOGO) ;Load The Default Icon
wc\hCursor=LoadCursor_(#Null,#IDC_ARROW) ;Load The Arrow Pointer
wc\hbrBackground=#Null ;No Background Required For GL
wc\lpszMenuName=#Null ;We Don't Want A Menu
wc\lpszClassName=@"OpenGL" ;Set The Class Name
If RegisterClass_(wc)=0 ;Attempt To Register The Window Class
MessageBox_(#Null,"Failed To Register The Window Class.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
ProcedureReturn #False
EndIf
If fullscreen ;Attempt Fullscreen Mode?
Protected dmScreenSettings.DEVMODE ;Device Mode
dmScreenSettings\dmSize=SizeOf(DEVMODE) ;Size Of The Devmode Structure
dmScreenSettings\dmFields=#DM_BITSPERPEL | #DM_PELSWIDTH | #DM_PELSHEIGHT ;bit flags to specify the members of DEVMODE that were initialized
dmScreenSettings\dmBitsPerPel=bits ;Selected Bits Per Pixel
dmScreenSettings\dmPelsWidth=width ;Selected Screen Width in pixels
dmScreenSettings\dmPelsHeight=height ;Selected Screen Height in pixels
;Try To Set Selected Mode And Get Results. Note: CDS_FULLSCREEN Gets Rid Of Start Bar
If ChangeDisplaySettings_(dmScreenSettings,#CDS_FULLSCREEN)<>#DISP_CHANGE_SUCCESSFUL
;If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode
If MessageBox_(#Null,"The Requested Fullscreen Mode Is Not Supported By"+Chr(10)+"Your Video Card. Use Windowed Mode Instead?","NeHe GL",#MB_YESNO | #MB_ICONEXCLAMATION)=#IDYES
fullscreen=#False ;Windowed Mode Selected. Fullscreen = FALSE
Else
;Pop Up A Message Box Letting User Know The Program Is Closing
MessageBox_(#Null,"Program Will Now Close.","ERROR",#MB_OK | #MB_ICONSTOP)
ProcedureReturn #False
EndIf
EndIf
EndIf
If fullscreen ;Are We Still In Fullscreen Mode?
dwExStyle=#WS_EX_APPWINDOW ;Window Extended Style
dwStyle=#WS_POPUP ;Windows Style
ShowCursor_(#False) ;Hide Mouse Pointer
Else
dwExStyle=#WS_EX_APPWINDOW | #WS_EX_WINDOWEDGE ;Window Extended Style
dwStyle=#WS_OVERLAPPEDWINDOW ;Windows Style
EndIf
AdjustWindowRectEx_(WindowRect,dwStyle,#False,dwExStyle) ;Adjust Window To True Requested Size
If fullscreen=0 ;if not fullscreen mode calculate screen centered window
wpos\x=(GetSystemMetrics_(#SM_CXSCREEN)/2)-((WindowRect\right-WindowRect\left)/2)
wpos\y=(GetSystemMetrics_(#SM_CYSCREEN)/2)-((WindowRect\bottom-WindowRect\top)/2)
EndIf
;CreateWindowEx_(Extended Window Style, Class Name, Window Title, Window Style, Window X Position, Window Y Position, Width, Height, No Parent Window, No Menu, Instance, No Creation Data)
hWnd=CreateWindowEx_(dwExStyle,"OpenGL",title,dwStyle | #WS_CLIPSIBLINGS | #WS_CLIPCHILDREN,wpos\x,wpos\y,WindowRect\right-WindowRect\left,WindowRect\bottom-WindowRect\top,#Null,#Null,hInstance,#Null)
If hWnd=0
KillGLWindow() ;Reset The Display
MessageBox_(#Null,"Window Creation Error.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
ProcedureReturn #False
EndIf
Protected pfd.PIXELFORMATDESCRIPTOR ;pfd Tells Windows How We Want Things To Be
pfd\nSize=SizeOf(PIXELFORMATDESCRIPTOR) ;Size Of This Structure
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 ;Request An RGBA Format
pfd\cColorBits=bits ;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=0 ;Did We Get A Device Context?
KillGLWindow() ;Reset The Display
MessageBox_(#Null,"Can't Create A GL Device Context.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
ProcedureReturn #False
EndIf
PixelFormat=ChoosePixelFormat_(hDC,pfd)
If PixelFormat=0 ;Did Windows Find A Matching Pixel Format?
KillGLWindow() ;Reset The Display
MessageBox_(#Null,"Can't Find A Suitable PixelFormat.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
ProcedureReturn #False
EndIf
If SetPixelFormat_(hDC,PixelFormat,pfd)=0 ;Are We Able To Set The Pixel Format?
KillGLWindow() ;Reset The Display
MessageBox_(#Null,"Can't Set The PixelFormat.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
ProcedureReturn #False
EndIf
hRC=wglCreateContext_(hDC)
If hRC=0 ;Are We Able To Get A Rendering Context?
KillGLWindow() ;Reset The Display
MessageBox_(#Null,"Can't Create A GL Rendering Context.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
ProcedureReturn #False
EndIf
If wglMakeCurrent_(hDC,hRC)=0 ;Try To Activate The Rendering Context
KillGLWindow() ;Reset The Display
MessageBox_(#Null,"Can't Activate The GL Rendering Context.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
ProcedureReturn #False
EndIf
ShowWindow_(hWnd,#SW_SHOW) ;Show The Window
SetForegroundWindow_(hWnd) ;Slightly Higher Priority
SetFocus_(hWnd) ;Sets Keyboard Focus To The Window
ReSizeGLScene(width,height) ;Set Up Our Perspective GL Screen
If InitGL()=0 ;Initialize Our Newly Created GL Window
KillGLWindow() ;Reset The Display
MessageBox_(#Null,"Initialization Failed.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
ProcedureReturn #False
EndIf
ProcedureReturn #True ;Success
EndProcedure
Procedure.l WndProc(hWnd.l,uMsg.l,wParam.l,lParam.l)
Select uMsg ;Check For Windows Messages
Case #WM_ACTIVATE ;Watch For Window Activate Message
If HiWord(wParam)=0 ;Check Minimization State
active=#True ;Program Is Active
Else
active=#False ;Program Is No Longer Active
EndIf
ProcedureReturn 0 ;Return To The Message Loop
Case #WM_SYSCOMMAND ;Intercept System Commands
Select wParam ;Check System Calls
Case #SC_SCREENSAVE ;Screensaver Trying To Start?
ProcedureReturn 0 ;Prevent From Happening
Case #SC_MONITORPOWER ;Monitor Trying To Enter Powersave?
ProcedureReturn 0 ;Prevent From Happening
EndSelect
Case #WM_CLOSE ;Did We Receive A Close Message?
PostQuitMessage_(0) ;Send A Quit Message
ProcedureReturn 0 ;Jump Back
Case #WM_KEYDOWN ;Is A Key Being Held Down?
keys(wParam)=#True ;If So, Mark It As TRUE
ProcedureReturn 0 ;Jump Back
Case #WM_KEYUP ;Has A Key Been Released?
keys(wParam)=#False ;If So, Mark It As FALSE
ProcedureReturn 0 ;Jump Back
Case #WM_MOUSEMOVE
MouseX=LoWord(lParam)
MouseY=HiWord(lParam)
Case #WM_SIZE ;Resize The OpenGL Window
ReSizeGLScene(LoWord(lParam),HiWord(lParam)) ;LoWord=Width, HiWord=Height
ProcedureReturn 0 ;Jump Back
EndSelect
;Pass All Unhandled Messages To DefWindowProc
ProcedureReturn DefWindowProc_(hWnd,uMsg,wParam,lParam)
EndProcedure
Procedure.l WinMain() ;Main Program
Protected msg.MSG ;Windows Message Structure
Protected done.b ;Bool Variable To Exit Loop
;Ask The User Which Screen Mode They Prefer
If MessageBox_(#Null,"Would You Like To Run In Fullscreen Mode?","Start FullScreen?",#MB_YESNO | #MB_ICONQUESTION)=#IDNO
fullscreen=#False ;Windowed Mode
EndIf
If CreateGLWindow("NeHe's Textures, Lighting & Keyboard Tutorial",640,480,24,fullscreen)=0 ;Create The Window
ProcedureReturn 0 ;Quit If Window Was Not Created
EndIf
While done=#False ;Loop That Runs While done=FALSE
If PeekMessage_(msg,#Null,0,0,#PM_REMOVE) ;Is There A Message Waiting?
If msg\message=#WM_QUIT ;Have We Received A Quit Message?
done=#True ;If So done=TRUE
Else ;If Not, Deal With Window Messages
TranslateMessage_(msg) ;Translate The Message
DispatchMessage_(msg) ;Dispatch The Message
EndIf
Else ;If There Are No Messages
;Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene()
If (active And DrawGLScene()=0) Or keys(#VK_ESCAPE) ;Active? Was There A Quit Received?
done=#True ;ESC or DrawGLScene Signalled A Quit
Else ;Not Time To Quit, Update Screen
SwapBuffers_(hDC) ;Swap Buffers (Double Buffering)
If keys(#VK_L) And lp=0 ;L Key Being Pressed Not Held?
lp=#True ;lp Becomes TRUE
light=~light & 1 ;Toggle Light TRUE/FALSE
If light=0 ;If Not Light
glDisable_(#GL_LIGHTING) ;Disable Lighting
Else ;Otherwise
glEnable_(#GL_LIGHTING) ;Enable Lighting
EndIf
EndIf
If keys(#VK_L)=0 ;Has L Key Been Released?
lp=#False ;If So, lp Becomes FALSE
EndIf
If keys(#VK_F) And fp=0 ;Is F Key Being Pressed?
fp=#True ;fp Becomes TRUE
filter+1 ;filter Value Increases By One
If filter>2 ;Is Value Greater Than 2?
filter=0 ;If So, Set filter To 0
EndIf
EndIf
If keys(#VK_F)=0 ;Has F Key Been Released?
fp=#False ;If So, fp Becomes FALSE
EndIf
If keys(#VK_PRIOR) ;Is Page Up Being Pressed?
xspeed=-1 ;If So, Move Into The Screen
ElseIf keys(#VK_NEXT) ;Is Page Down Being Pressed?
xspeed=1 ;If So, Move Towards The Viewer
Else
xspeed=0
EndIf
If keys(#VK_UP) And xspeed>-0.5 ;Is Up Arrow Being Pressed?
z+0.02 ;If So, Decrease xspeed
ElseIf keys(#VK_DOWN) And xspeed<0.5 ;Is Down Arrow Being Pressed?
z-0.02 ;If So, Increase xspeed
EndIf
If keys(#VK_RIGHT) And yspeed<0.5 ;Is Right Arrow Being Pressed?
x-0.02 ;If So, Increase yspeed
ElseIf keys(#VK_LEFT) And yspeed>-0.5 ;Is Left Arrow Being Pressed?
x+0.02 ;If So, Decrease yspeed
EndIf
EndIf
If keys(#VK_F1) ;Is F1 Being Pressed?
keys(#VK_F1)=#False ;If So Make Key FALSE
KillGLWindow() ;Kill Our Current Window
fullscreen=~fullscreen & 1 ;Toggle Fullscreen / Windowed Mode
;Recreate Our OpenGL Window
If CreateGLWindow("NeHe's Textures, Lighting & Keyboard Tutorial",640,480,16,fullscreen)=0
ProcedureReturn 0 ;Quit If Window Was Not Created
EndIf
EndIf
EndIf
Wend
;Shutdown
KillGLWindow() ;Kill The Window
End ;Exit The Program
EndProcedure
WinMain() ;run the main program
3. Kann mann ein Objekt alleine Drehen, oder geht das nur mit der ganzen Welt?
[Edit]Eine Frage noch...
4. Kann ich auch Anti-Aliasing in OpenGL einschalten oder geht das nur mit DX? oder gibts vielleicht noch eine Möglichkeit?
Danke schonmal!
-
- Beiträge: 557
- Registriert: 29.11.2005 15:05
ich habe etwas in freebasic geschrieben für opengl. einen kasten mit 4 räder und 3 kranausleger . alles kann man mit den tasten unabhängig steuern. ausleger: rechts links hoch runter, auto : vorwärts rückwärts drehen. den sourcecode kann man gut für purebasic umsetzen.
einzige manko, bei freebasic kann ich milkshapedateien einlesen in purebasic gibt es für die objekteinlesung nischt.
gib mal deine mail.
mfg
einzige manko, bei freebasic kann ich milkshapedateien einlesen in purebasic gibt es für die objekteinlesung nischt.
gib mal deine mail.
mfg
Hi,
Ich hab ein Problem...
Es gibt eine Konstante die in opengl-include nicht vorhanden ist. Kann mir jemend den wert hier reinschreiben, wenn er c++ oder anderes hat...
Ich glaub man muss aber erst in c++ einen include machen:
Danke!!!
Ich hab ein Problem...
Es gibt eine Konstante die in opengl-include nicht vorhanden ist. Kann mir jemend den wert hier reinschreiben, wenn er c++ oder anderes hat...
Code: Alles auswählen
#GL_MULTISAMPLE_ARB
Code: Alles auswählen
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
Probiere mal für ARB_Multisample den wert 32925.
glTexCoord2f legt die UV Koordinaten auf einer Textur für die den jeweiligen Vertex fest. Du kennst vielleicht diese Spieltexturen, auf denen auseinandergeklappt das gesamte Objekt zu sehen ist... du musst OpenGL ja irgendwie begreiflich machen, was von der Textur wie auf welches Polygon gehört.
glTexCoord2f legt die UV Koordinaten auf einer Textur für die den jeweiligen Vertex fest. Du kennst vielleicht diese Spieltexturen, auf denen auseinandergeklappt das gesamte Objekt zu sehen ist... du musst OpenGL ja irgendwie begreiflich machen, was von der Textur wie auf welches Polygon gehört.
Danke, aber ich muss mich noch ein bischen mit dem Code den ich im internet gefunden hab (c++), auseinander setzten...
http://nehe.gamedev.net/data/lessons/le ... ?lesson=46
Ich glaube ich verwende den wert noch nicht richtig...
Das mit >glTexCoord2f hab ich jett schon verstanden.
http://nehe.gamedev.net/data/lessons/le ... ?lesson=46
Ich glaube ich verwende den wert noch nicht richtig...
Das mit >glTexCoord2f hab ich jett schon verstanden.