Accueil > > > EXEMPLE D'APPLICATION DE TEXTURE AVEC OPENGL
EXEMPLE D'APPLICATION DE TEXTURE AVEC OPENGL
Information sur la source
Description
C'est un exemple tout simple d'application de texture avec OpenGL, rien n'est optimisé, c'est juste pour avoir un aperçu du mécanisme global.
Source
- 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.
-
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.
Conclusion
Ce listing est trés largement inspiré d'un tutoriel C écrit par Antoche (http://antoche.alrj.org/)
L'implémentation OpenGL que j'utilise est celle de Mike Lischke (public@lischke-online.de), il s'agit des fichiers OpenGL12.pas et Geometry.pas qui se trouvent également dans le zip
En ce qui concerne les bugs, la gestion de la rotation du cube est trés aléatoire et le programme ne quitte pas s'il ne trouve pas la texture (il suffit de remplacer le "ShowMessage('Impossible de charger la texture')" par un "Application.terminate" bien barbare
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
TECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURSTECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURS par ROMELARD Fabrice
Animé par: Laurent Cotton Le développement dans SharePoint 2010 passe par plusieurs axes qui seront évoqués dans cette session, mais plus particulièrement les développements simples lié au besoin Business Business Connectivity Services Ce BCS es...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOURTECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOUR par ROMELARD Fabrice
Cette session est la dernière pleinière de ces 3 jours de TechDays Paris 2010. Généralement, cette troisième journée est plus axée sur l'avenir vu par Microsoft. Après un retour sur l'avenir vu par la Science Fiction ou par ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion
Forum
RE : SAVEDIALOGRE : SAVEDIALOG par JulioDelphi
Cliquez pour lire la suite par JulioDelphi RE : SAVEDIALOGRE : SAVEDIALOG par zeydounnounou
Cliquez pour lire la suite par zeydounnounou
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|