Tut [OpenGL 04] Flat shaded cube, lumières premier pas

Généralités sur la programmation 3D
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Tut [OpenGL 04] Flat shaded cube, lumières premier pas

Message par Buckethead »

Pour continuer la série tuto OpenGL de Cpl.Bator, voici un petit code sur les lumières.
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)




Image
Le code compilé: http://stanz05.free.fr/shade.exe





Autre demo!
Image
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
Dernière modification par Buckethead le mar. 13/nov./2007 8:57, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

C'est excellent !
J'aime beaucoup le logo PB sauce lego :)
Bravo !
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

haha Ar-S :P Autant le dire tout de suite, j'ai toujours été fan des Lego® ;D
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Très sympe comme code en effet, je vois que tu progresse bien, et qu'OpenGL
commence à devenir ton petit jardin.. ;)
Force et sagesse...
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

Ca avance petit à petit ;) mais je me sent capable de bricoler des petits trucs maintenant. J'ai envie de voir un peu les sprites et particules (rapide coup d'oeil) les transparences, le glow, avoir quelques effets à proposer. Je reviendrais sur les lumières, surtout pour la position et l'angle des spots.
Répondre