0/5 (2 avis)
Vue 15 634 fois - Téléchargée 1 342 fois
unit Unit1; interface uses {*** Implementation d'OPENGL 1.2 ***} OpenGL12, Windows, Forms, Classes, ExtCtrls, Messages,Controls,sysutils, StdCtrls,Graphics,Dialogs; type TMainForm = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormResize(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton ; Shift: TShiftState ; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormShow(Sender: TObject); private RC : HGLRC; Souris : Boolean; rx,ry : integer; dx,dy : integer; Texture : TGLuint; procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; end; var MainForm: TMainForm; {*** On déclare une texture comme un tableau à 2 dimensions de la taille de la texture à charger. Attention, pour éviter des lignes noires trés disgracieuses entre les raccords de textures, je commence mon tableau à 1 ***} Tex : Array[1..256,1..256]of TGluInt; implementation {$R *.DFM} {*** Chargement de la texture : comme je suis fénéant, je profite de l'objet "TPicture" offert par Delphi ***} Function ChargerTexture(Fichier : String) : Boolean; Var M : Integer; N : Integer; Img : TPicture; Begin Result := False; If FileExists(Fichier) Then Begin Img := Tpicture.Create; Img.LoadFromFile(Fichier); For N := 1 To 256 Do For M := 1 To 256 Do Tex[N,M] := Img.Bitmap.Canvas.Pixels[M,N]; Result := True; End; End; {*** Création d'un rendering context au démarrage de l'appli ***} procedure TMainForm.FormCreate(Sender: TObject); Var Machin : Hpalette; begin RC:=CreateRenderingContext(Canvas.Handle,[opDoubleBuffered],32,0,0,0,0,Machin); Souris := False; end; {*** Suppression du rendering context à la fermeture de l'appli ***} procedure TMainForm.FormDestroy(Sender: TObject); begin DestroyRenderingContext(RC); end; {*** Procedure principale : dessiner l'objet dans le rendering context ***} procedure TMainForm.FormPaint(Sender: TObject); begin ActivateRenderingContext(Canvas.Handle,RC); {*** Options OpenGL ***} glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity; {*** Placer le point de vue ***} gluLookAt(0,0,7,0,0,-10,0,1,0); {*** Appliquer la rotation ***} glRotatef(ry,1,0,0); glRotatef(-rx,0,1,0); {*** Activer la gestion des textures ***} glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE); glColorMaterial(GL_FRONT_AND_BACK,GL_SPECULAR); {*** Dessiner un bô cube et appliquer la texture ***} glBegin(GL_QUADS); glTexCoord2i(0,0);glVertex3i(-1,-1,-1); glTexCoord2i(1,0);glVertex3i(+1,-1,-1); glTexCoord2i(1,1);glVertex3i(+1,+1,-1); glTexCoord2i(0,1);glVertex3i(-1,+1,-1); glTexCoord2i(0,0);glVertex3i(-1,-1,+1); glTexCoord2i(1,0);glVertex3i(+1,-1,+1); glTexCoord2i(1,1);glVertex3i(+1,+1,+1); glTexCoord2i(0,1);glVertex3i(-1,+1,+1); glTexCoord2i(0,0);glVertex3i(+1,-1,-1); glTexCoord2i(1,0);glVertex3i(+1,-1,+1); glTexCoord2i(1,1);glVertex3i(+1,+1,+1); glTexCoord2i(0,1);glVertex3i(+1,+1,-1); glTexCoord2i(0,0);glVertex3i(-1,-1,-1); glTexCoord2i(1,0);glVertex3i(-1,-1,+1); glTexCoord2i(1,1);glVertex3i(-1,+1,+1); glTexCoord2i(0,1);glVertex3i(-1,+1,-1); glTexCoord2i(0,0);glVertex3i(-1,+1,-1); glTexCoord2i(1,0);glVertex3i(+1,+1,-1); glTexCoord2i(1,1);glVertex3i(+1,+1,+1); glTexCoord2i(0,1);glVertex3i(-1,+1,+1); glTexCoord2i(0,0);glVertex3i(-1,-1,+1); glTexCoord2i(1,0);glVertex3i(+1,-1,+1); glTexCoord2i(1,1);glVertex3i(+1,-1,-1); glTexCoord2i(0,1);glVertex3i(-1,-1,-1); glEnd(); glDisable(GL_TEXTURE_2D); {*** Inverser les buffers ***} SwapBuffers(Canvas.Handle); DeactivateRenderingContext; end; procedure TMainForm.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #27 then Application.Terminate; end; {*** Initialisation à chaque redimmensionnement de la fenêtre ***} procedure TMainForm.FormResize(Sender: TObject); Var Ch : String; begin Ch := ExtractFilePath(Application.Exename); If Ch[Length(Ch)] <> '\' Then Ch := Ch + '\'; If not ChargerTexture(Ch + 'Texture.Bmp') then ShowMessage('Impossible de charger la texture'); wglMakeCurrent(Canvas.handle,RC); glViewport(0,0,Width,Height); glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(35,Width/Height,1,100); {*** Options pour la gestion des textures ***} glPixelStorei(GL_UNPACK_ALIGNMENT,1); glGenTextures(1, @Texture); glBindTexture(GL_TEXTURE_2D, Texture); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); {*** Chargement de la texture ***} glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256 ,256 , 0, GL_RGBA,GL_UNSIGNED_BYTE,@Tex); wglMakeCurrent(0,0); Refresh; end; {*** Eviter le clignotement du fond de la feuille entre les swapbuffers ***} procedure TMainForm.WMEraseBkgnd(var Message: TWMEraseBkgnd); begin Message.Result:=1; end; {*** Routine faite avec les pieds pour faire pivoter le cube ***} procedure TMainForm.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Souris := TRue; end; procedure TMainForm.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Souris := False; end; procedure TMainForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin If Souris then begin ry := y-dy; rx := dx-x; Repaint; end else begin dx := x ; dy := y ; end; Caption := '( X : '+inttostr(x)+' - Y : '+inttostr(y)+' )'; end; {*** Forcer l'initialisation d'OpenGL à l'affichage de la feuille ***} procedure TMainForm.FormShow(Sender: TObject); begin MainForm.FormResize(Nil); end; {*** Tiens ? a pu ! ***} end.
7 juin 2005 à 08:51
http://glinfrench.apinc.org/index.php3
3 juin 2005 à 10:33
openGL12 est simple d'utilisation, il m'a permit de commencer un nouveau projet.
Par contre, si j'ai réussi à créer des objets 3D texturés, je ne sais pas comment leur appliquer une texture transparente.
Quelqu'un aurait-il une idée ?
D'avance, merci.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.