BGRABitmap and OpenGL/fr

From Lazarus wiki
Revision as of 10:33, 21 May 2018 by Circular (talk | contribs) (Created page with "BGRABitmap permet de dessiner avec OpenGL et donc de profiter de l'accélération matérielle. === Surface OpenGL === Vous aurez besoin aussi d'une surface OpenGL. Le paquet...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

BGRABitmap permet de dessiner avec OpenGL et donc de profiter de l'accélération matérielle.

Surface OpenGL

Vous aurez besoin aussi d'une surface OpenGL. Le paquet LazOpenGLContext dans le répertoire components\opengl de lazarus fournit une surface. Il est nécessaire d'ajouter un peu de code pour gérer correctement.

L'installation du paquet sur Linux peut poser problème. Voir ci-dessous avant de procéder à l'installation des paquets.

TBGLVirtualScreen

Le paquet BGLControls dans l'archive de BGRABitmap contient un composant TBGLVirtualScreen qui fournit une surface OpenGL plus facile à utiliser. Il est recommandé d'installer ce paquet en plus.

Il apparait dans la barre d'outil des composants dans l'onglet OpenGL. Il ne reste qu'à le poser sur la fenêtre et de redéfinir l'événement Redraw. Par exemple pour dessiner un rectangle rouge:

uses BGRABitmapTypes;

procedure TForm1.BGLVirtualScreen1Redraw(Sender: TObject;
  BGLContext: TBGLContext);
begin
  BGLContext.Canvas.FillRect(10,10,100,100, CSSRed);
end;

Sans TBGLVirtualScreen

Créez le composant avec les propriétés suivantes:

  OpenGLControl := TOpenGLControl.Create(Self);
  with OpenGLControl do
  begin
    Align := alClient;
    Parent := Self;
    OnPaint := @OpenGLControlPaint;    
    AutoResizeViewport := True; //ensure correct proportions
  end;

Dans l'événement Paint:

procedure TForm1.OpenGLControlPaint(Sender: TObject);
var
  mousePos: TPoint;
begin
  BGLViewPort(OpenGLControl.Width, OpenGLControl.Height, BGRAWhite);

  //effectuer votre dessin
  BGLCanvas.FillRect(10,10,100,100, CSSRed);

  OpenGLControl.SwapBuffers;
end;

Note sur Linux

Sous Linux, il se peut que la bibliothèque OpenGL soit manquante ce qui empêche l'étape finale de compilation des liens. Pour résoudre le problème, effectuez:

 #installer la librairie
 sudo apt-get install libgl-dev 
 #éventuellement, ajouter un lien vers la librairie (pour processeurs 64bits)
 sudo ln -s /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 /usr/lib/libGL.so

Lors de la recompilation et du redémarrage de Lazarus, il se peut que le programme reste bloqué au slashscreen. Dans ce cas, terminez le processus avec le moniteur système.

Textures

OpenGL utilise sa prore mémoire pour stocker les images. De plus il est nécessaire d'être dans le bon contexte OpenGL. Pour cela, chargez les images dans l'évenement OnPaint ou bien utilisez les événements LoadTextures et UnloadTextures de TBGLVirtualScreen. Vous pouvez également utiliser la fonction UseContext.

Les textures correspondent à une variable IBGLTexture. Vous pouvez charger une texture directement depuis un fichier:

var tex: IBGLTexture;

tex := BGLTexture(path);

Pour libérer la texture, appelez simplement

tex := nil;

Création de textures

Au lieu d'utiliser la classe TBGRABitmap, utilisez la classe TBGLBitmap de l'unité BGRAOpenGL. Elle est semblable en tout point à TBGRABitmap, sauf qu'elle a une propriété Texture qui peut être utilisée avec les fonctions OpenGL.

Enfin si vous avez fini le tracé de la texture et que vous n'allez plus la modifier, vous pouvez libérer l'objet TBGLBitmap et récupérer la texture avec la fonction MakeTextureAndFree.

var bmp: TBGLBitmap; tex: IBGLTexture;

  bmp := TBGLBitmap.Create(path);
  bmp.Rectangle(0,0,bmp.Width,bmp.Height,CSSRed,dmSet);
  tex:=bmp.MakeTextureAndFree;