C'est une première approche, je trouve cette partie assez complexe.
Le mode "flat" est parfait pour commencer à explorer ce (lourd) chapitre.
Vous n'aurez pas forcement besoin du code entre les pointillés.
Notez que l'on peut très bien ne pas utiliser les Spots etc pour un simple cube, mais juste:
Code : Tout sélectionner
glShadeModel_(#GL_FLAT) ; Nos objets ont un rendu "flat"
glLightModeli_(#GL_LIGHT_MODEL_LOCAL_VIEWER,#GL_TRUE)
glEnable_(#GL_LIGHTING)
glEnable_(#GL_LIGHT0)
glEnable_(#GL_COLOR_MATERIAL)
Le code compilé: http://stanz05.free.fr/shade.exe
Autre demo!
L'executable: http://stanz05.free.fr/shade2.exe
Code : Tout sélectionner
; Tut [OpenGL 04] Flat shaded cube.
; ou "cube ombré"
; Etant moi même débutant, je ne peut vous faire un grand exposé sur les lumières.
; Ce code vous permet surtout de pratiquer des exercices.
; - - - - -
; Les tutos OpenGL de Cpl.Bator et moi-même:
; Tut [OPENGL 01] Cube3D : -----> http://www.purebasic.fr/french/viewtopic.php?t=5334
; Tut [OpenGL 02] Les bases du texturing -----> http://www.purebasic.fr/french/viewtopic.php?t=5339
; Tut [OpenGL 03] Texture animée dans un cube -----> http://www.purebasic.fr/french/viewtopic.php?t=7406
; Importe la "tesselation" d'une sphere. Je ne sais pas encore afficher la cèlèbre "teapot". Aide bienvenue!
Import "glu32.lib"
gluSphere(*qobj,radius.d,slices.l,stacks.l) ;draws a sphere
; gluSolidTeapot(size.d) <> gluSolidTeapot(15) = POLINK error
EndImport
IncludeFile "OpenGl.Pb"
Declare Cube(taille.d)
; Ouvre une window maximizée sans titlebar ou bordures. By benny!weltenkonstrukteur.de (Thx Benny)
ExamineDesktops() : Sx = DesktopWidth(0) :Sy = DesktopHeight(0) : pfd.PIXELFORMATDESCRIPTOR : pfd\cColorBits = 32 : pfd\cDepthBits = 32
pfd\dwFlags = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER
hDC = GetDC_ ( CreateWindow_("edit", 0, #WS_POPUP | #WS_VISIBLE | #WS_MAXIMIZE, 0, 0 ,0 ,0, 0 ,0 ,0, 0 ) )
SetPixelFormat_ (hDC,ChoosePixelFormat_(hDC,pfd),pfd) : wglMakeCurrent_ (hDC,wglCreateContext_(hDC))
ShowCursor_(#False)
; Init GL
glMatrixMode_(#GL_PROJECTION)
gluPerspective_(60,Sx/Sy,1,5000)
glMatrixMode_(#GL_MODELVIEW)
glEnable_(#GL_TEXTURE_2D)
glHint_(#GL_PERSPECTIVE_CORRECTION_HINT,#GL_NICEST)
glEnable_(#GL_DEPTH_TEST)
glEnable_(#GL_CULL_FACE)
;- ## La lumière
glShadeModel_(#GL_FLAT) ; Nos objets ont un rendu "flat"
glLightModeli_(#GL_LIGHT_MODEL_LOCAL_VIEWER,#GL_TRUE)
glEnable_(#GL_LIGHTING)
glEnable_(#GL_LIGHT0)
glEnable_(#GL_COLOR_MATERIAL) ; sans cette commmande tout est monochrome !
; En fait cette lumière est en fonction de la matière, si la lumière est rouge, sur une matière bleu, ca ne marche pas...
; Le plus simple c'est de mettre tout en blanc. Comme dans la réalité, le blanc contient toute les couleurs.
; Lumière diffuse blanche. (et "specular")
Dim Ldif.f(4) : Ldif(0) = 1.0 : Ldif(1) = 1.0 : Ldif(2) = 1.0 : Ldif(3) = 1.0
glLightfv_(#GL_LIGHT0,#GL_DIFFUSE,Ldif())
glLightfv_(#GL_LIGHT0,#GL_SPECULAR,Ldif())
;Paramétrage du matériau, blanc
Mshiny = 100 ; brilliance (avec une plus petite valeur on obtient une scene "flashy")
Dim Mspec.f(4) : Mspec(0) = 1.0 : Mspec(1) = 1.0 : Mspec(2) = 1.0 : Mspec(3) = 1.0
glMaterialfv_(#GL_FRONT_AND_BACK,#GL_SPECULAR,Mspec())
glMaterialf_(#GL_FRONT_AND_BACK,#GL_SHININESS,Mshiny)
; Position du "spot 0" (pas terrible désolé ;) il faut pratiquer...)
Dim Lpos.f(4) : Lpos(0) = 0.0 : Lpos(1) = 14.0 : Lpos(2) = 10.0 : Lpos(3) = 1.0
glLightfv_(#GL_LIGHT0,#GL_POSITION,Lpos())
; Direction du "Spot 0"
Dim Dir.f(4) : Dir(0) = 0.0 : Dir(1) = 0.0 : Dir(2) = -10.0 : Dir(3) = 1.0
glLightfv_(#GL_LIGHT0, #GL_SPOT_DIRECTION, Dir());
; Angle du cone de la lumière, entre 0 et 180° Essayez 10° !
spotCutOff = 180
glLightf_(#GL_LIGHT0, #GL_SPOT_CUTOFF, spotCutOff)
; On atténue la lumière en fonction de la profondeur (bof car le spot est mal positionné)
glLightf_(#GL_LIGHT0, #GL_QUADRATIC_ATTENUATION, 0.000000001)
Repeat
angle+1
; Le ciel
glClearColor_(0.98 ,0.95 , 0.92 ,0)
glClear_(#GL_DEPTH_BUFFER_BIT | #GL_COLOR_BUFFER_BIT )
; Caméra
glLoadIdentity_( )
gluLookAt_(250+1000*Sin(angle/100),0,0,0,0,0,0,0,1)
glRotated_(10,1,1,1)
glRotated_(360*Sin(angle/512),0.0,0.0,1.0)
;glPolygonMode_(#GL_FRONT_AND_BACK, #GL_LINE) ; mode "fil de fer" ou encore "wireframe"
;- # Le flat shaded cube"
glPushMatrix_()
glTranslated_(-400,900,400)
glRotated_(angle,1,1,1)
glColor3ub_(0,175,5) ; La couleur en mode RGB. Plus simple mais le GPU ne connait que les "float"
cube(200)
glPopMatrix_()
;---------------------------------------------------------------------- 8< -----------------------
; Partie du code falcultatif
If angle > 600 : sol = 30 : EndIf
; Le damier. Ou "checkerboard"
; Très mauvaise méthode car fait à partir de cubes et rien est precalculé.
; Néanmoins ca nous montre qu'il va falloir apprendre les "vertex array", "display list" etc.
glRotated_(-10,0,1,0)
glTranslated_(0,1000,0)
glRotated_(angle/2,0,0,1)
For y = 0 To 4000 Step 80
For x = 0 To 8000 Step 80
glPushMatrix_()
If (x+y) & 20 : glColor3ub_(255,255,255) : Else : glColor3ub_(0,0,10) : EndIf
glTranslatef_(-4000+x,-2000+y,-180+sol*Sin(800*x+angle/20)+sol*Cos(800*y+angle/20))
size = angle /10 : If size >= 40 : size = 40 : EndIf
Cube(size)
glPopMatrix_()
Next
Next
; La sphere:
glColor3ub_(255,0,0)
glPushMatrix_()
glTranslated_(-450+400*Sin(angle/100) , 400*Cos(angle/100) , Abs(60*Sin(angle/12)))
glRotatef_(3*angle,0.8,0.5,0.8)
gluSphere(gluNewQuadric_(),110,24,24)
glPopMatrix_()
;/fin de cette partie du code
;-------------------------------- 8< --------------------------------------------------------------
; Vsync et sortie/gestion clavier
SwapBuffers_ (hDC)
Until (GetAsyncKeyState_(#VK_ESCAPE))
End
; Dessinne un Cube. La taille est dynamique, on évite ainsi les problèmes de normalisation avec fscale et la lumière.
Procedure Cube(taille.d)
glBegin_(#GL_QUADS)
glNormal3d_(-1,0,0) ;face gauche
glVertex3d_(-taille,taille,taille)
glVertex3d_(-taille,taille,-taille)
glVertex3d_(-taille,-taille,-taille)
glVertex3d_(-taille,-taille,taille)
glNormal3d_(0,1,0) ;face haut
glVertex3d_(-taille,taille,taille)
glVertex3d_(taille,taille,taille)
glVertex3d_(taille,taille,-taille)
glVertex3d_(-taille,taille,-taille)
glNormal3d_(0,-1,0) ;face bas
glVertex3d_(-taille,-taille,taille)
glVertex3d_(-taille,-taille,-taille)
glVertex3d_(taille,-taille,-taille)
glVertex3d_(taille,-taille,taille)
glNormal3d_(0,0,-1) ;face arriere
glVertex3d_(taille,taille,-taille)
glVertex3d_(taille,-taille,-taille)
glVertex3d_(-taille,-taille,-taille)
glVertex3d_(-taille,taille,-taille)
glNormal3d_(1,0,0) ;face gauche
glVertex3d_(taille,taille,taille)
glVertex3d_(taille,-taille,taille)
glVertex3d_(taille,-taille,-taille)
glVertex3d_(taille,taille,-taille)
glNormal3d_(0,0,1) ; face avant
glVertex3d_(-taille,taille,taille)
glVertex3d_(-taille,-taille,taille)
glVertex3d_(taille,-taille,taille)
glVertex3d_(taille,taille,taille)
glEnd_()
EndProcedure