Bonjour,
voila, j'ai lu tout ce que j'ai pu trouver dans les forum de developpez.com au sujet des screenshot opengl, glreadpixels, glreadbuffer, etc... mais je n'ai pas reussi a trouver d'exemple de code simple pour faire un screenshot.
Je travaille en C# avec le framework Tao
Je vais faire de l'offscreen rendering par la suite, mais je doit utiliser les fonctions les plus compatibles possibles (donc pas de FBO ni de PBO car ces extensions ne sont pas supportés -> chipset graphique intégré sur portable powa), uniquement du readpixels dans le back buffer
L'initalisation de la fenetre se fait dans le monde.DrawYourself, mais ou j'ai un soucis, c'est que l'image lue ressemble à ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 int v_width = width; int v_height = height; byte[] v_contenu_image = new byte[4*v_width*v_height]; //on redessine le monde monde.DrawYourself(this); //on récupère le contenu du buffer BACK (pour faire du rendu offscreen) Gl.glReadBuffer(Gl.GL_BACK); Gl.glReadPixels(0, 0, v_width, v_height, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, v_contenu_image); Bitmap v_image = new Bitmap(width, height); for(int i=v_height-1; i>=0; i--)//numéro de ligne { for(int j=0; j<v_width; j++)//numéro de colonne { int v_taille_ligne = 4*v_width; //l'ordre est determiné par le format de rapatriement (GL_RGBA) int v_red = v_contenu_image[(v_taille_ligne*i)+j]; int v_green = v_contenu_image[(v_taille_ligne*i)+j+1]; int v_blue = v_contenu_image[(v_taille_ligne*i)+j+2]; int v_alpha = v_contenu_image[(v_taille_ligne*i)+j+3]; v_image.SetPixel(j, i, Color.FromArgb(v_alpha, v_red, v_green, v_blue)); } } v_image.Save(chemin_fichier_image, System.Drawing.Imaging.ImageFormat.Bmp);
Est ce qu'il y a quelque chose que je fait mal ?
Faut-il que je spécifie explicitement mon mode de rendu à l'initialisation (RGBA) ?
Partager