gKit2 light
texture.cpp
1 
2 #include <cassert>
3 #include <cstdio>
4 #include <algorithm>
5 
6 #include "texture.h"
7 #include "image_io.h"
8 
9 
10 int miplevels( const int width, const int height )
11 {
12  int w= width;
13  int h= height;
14  int levels= 1;
15  while(w > 1 || h > 1)
16  {
17  w= std::max(1, w / 2);
18  h= std::max(1, h / 2);
19  levels= levels + 1;
20  }
21 
22  return levels;
23 }
24 
25 GLuint make_texture( const int unit, const int width, const int height, const GLenum texel_type, const GLenum data_format, const GLenum data_type )
26 {
27  // cree la texture openGL
28  GLuint texture;
29  glGenTextures(1, &texture);
30  glActiveTexture(GL_TEXTURE0 + unit);
31  glBindTexture(GL_TEXTURE_2D, texture);
32 
33  // fixe les parametres de filtrage par defaut
34  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
35  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
36  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
37  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
38 
39  // transfere les donnees dans la texture, 4 float par texel
40  glTexImage2D(GL_TEXTURE_2D, 0,
41  texel_type, width, height, 0,
42  data_format, data_type, nullptr);
43 
44  // prefiltre la texture / alloue les mipmaps
45  glGenerateMipmap(GL_TEXTURE_2D);
46  return texture;
47 }
48 
49 GLuint make_flat_texture( const int unit, const int width, const int height, const GLenum texel_type, const GLenum data_format, const GLenum data_type )
50 {
51  // cree la texture openGL
52  GLuint texture;
53  glGenTextures(1, &texture);
54  glActiveTexture(GL_TEXTURE0 + unit);
55  glBindTexture(GL_TEXTURE_2D, texture);
56 
57  // fixe les parametres de filtrage par defaut
58  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
59  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
60  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
61  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
62 
63  // 1 seul mipmap
64  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
65 
66  // transfere les donnees dans la texture, 4 float par texel
67  glTexImage2D(GL_TEXTURE_2D, 0,
68  texel_type, width, height, 0,
69  data_format, data_type, nullptr);
70 
71  // prefiltre la texture / alloue les mipmaps
72  glGenerateMipmap(GL_TEXTURE_2D);
73  return texture;
74 }
75 
76 GLuint make_texture( const int unit, const Image& im, const GLenum texel_type )
77 {
78  if(im == Image::error())
79  return 0;
80 
81  // cree la texture openGL
82  GLuint texture;
83  glGenTextures(1, &texture);
84  glActiveTexture(GL_TEXTURE0 + unit);
85  glBindTexture(GL_TEXTURE_2D, texture);
86 
87  // fixe les parametres de filtrage par defaut
88  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
89  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
90  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
91  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
92 
93  // transfere les donnees dans la texture, 4 float par texel
94  glTexImage2D(GL_TEXTURE_2D, 0,
95  texel_type, im.width(), im.height(), 0,
96  GL_RGBA, GL_FLOAT, im.data());
97 
98  // prefiltre la texture
99  glGenerateMipmap(GL_TEXTURE_2D);
100  return texture;
101 }
102 
103 GLuint make_texture( const int unit, const ImageData& im, const GLenum texel_type )
104 {
105  if(im.pixels.empty())
106  return 0;
107 
108  // cree la texture openGL
109  GLuint texture;
110  glGenTextures(1, &texture);
111  glActiveTexture(GL_TEXTURE0 + unit);
112  glBindTexture(GL_TEXTURE_2D, texture);
113 
114  // fixe les parametres de filtrage par defaut
115  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
116  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
117  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
118  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
119 
120  GLenum format;
121  switch(im.channels)
122  {
123  case 1: format= GL_RED; break;
124  case 2: format= GL_RG; break;
125  case 3: format= GL_RGB; break;
126  case 4: format= GL_RGBA; break;
127  default: format= GL_RGBA;
128  }
129 
130  GLenum type;
131  switch(im.size)
132  {
133  case 1: type= GL_UNSIGNED_BYTE; break;
134  case 4: type= GL_FLOAT; break;
135  default: type= GL_UNSIGNED_BYTE;
136  }
137 
138  // transfere les donnees dans la texture
139  glTexImage2D(GL_TEXTURE_2D, 0,
140  texel_type, im.width, im.height, 0,
141  format, type, im.data());
142 
143  // prefiltre la texture
144  glGenerateMipmap(GL_TEXTURE_2D);
145  return texture;
146 }
147 
148 GLuint read_texture( const int unit, const char *filename, const GLenum texel_type )
149 {
150  ImageData image= read_image_data(filename);
151  return make_texture(unit, image, texel_type);
152 }
153 
154 
155 // creation des textures
156 GLuint make_depth_texture( const int unit, const int width, const int height, const GLenum texel_type )
157 {
158  return make_flat_texture(unit, width, height, texel_type, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT);
159 }
160 
161 GLuint make_uint_texture( const int unit, const int width, const int height, const GLenum texel_type )
162 {
163  return make_flat_texture(unit, width, height, texel_type, GL_RED_INTEGER, GL_UNSIGNED_INT);
164 }
165 
166 GLuint make_float_texture( const int unit, const int width, const int height, const GLenum texel_type )
167 {
168  return make_flat_texture(unit, width, height, texel_type, GL_RED, GL_FLOAT);
169 }
170 
171 GLuint make_vec2_texture( const int unit, const int width, const int height, const GLenum texel_type )
172 {
173  return make_flat_texture(unit, width, height, texel_type, GL_RG, GL_FLOAT);
174 }
175 
176 GLuint make_vec3_texture( const int unit, const int width, const int height, const GLenum texel_type )
177 {
178  return make_flat_texture(unit, width, height, texel_type, GL_RGB, GL_FLOAT);
179 }
180 
181 GLuint make_vec4_texture( const int unit, const int width, const int height, const GLenum texel_type )
182 {
183  return make_flat_texture(unit, width, height, texel_type, GL_RGBA, GL_FLOAT);
184 }
185 
186 
187 //
188 int screenshot( const char *filename )
189 {
190  // recupere le contenu de la fenetre / framebuffer par defaut
191  glFinish();
192 
193  glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
194  glReadBuffer(GL_BACK);
195 
196  // recupere les dimensions de la fenetre
197  GLint viewport[4];
198  glGetIntegerv(GL_VIEWPORT, viewport);
199 
200  // transfere les pixels
201  ImageData image(viewport[2], viewport[3], 4);
202  glReadPixels(0, 0, image.width, image.height,
203  GL_RGBA, GL_UNSIGNED_BYTE, image.data());
204  // ecrit l'image
205  return write_image_data(image, filename);
206 }
207 
208 int screenshot( const char *prefix, const int id )
209 {
210  char tmp[4096];
211  sprintf(tmp,"%s%02d.png", prefix, id);
212  return screenshot(tmp);
213 }
214 
215 int capture( const char *prefix )
216 {
217  static int id= 1;
218 
219  char tmp[4096];
220  sprintf(tmp,"%s%04d.bmp", prefix, id);
221 
222  if(id % 30 == 0)
223  printf("capture frame '%s'...\n", tmp);
224 
225  id++;
226  return screenshot(tmp);
227 }
228 
representation d'une image.
Definition: image.h:21
int height() const
renvoie la hauteur de l'image.
Definition: image.h:100
const void * data() const
renvoie un pointeur sur le stockage des couleurs des pixels.
Definition: image.h:84
static Image & error()
Definition: image.h:126
int width() const
renvoie la largeur de l'image.
Definition: image.h:98
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Definition: text.cpp:140
ImageData read_image_data(const char *filename)
charge les donnees d'un fichier png. renvoie une image initialisee par defaut en cas d'echec.
Definition: image_io.cpp:216
int write_image_data(ImageData &image, const char *filename)
enregistre des donnees dans un fichier png.
Definition: image_io.cpp:229
Point max(const Point &a, const Point &b)
renvoie la plus grande composante de chaque point. x, y, z= max(a.x, b.x), max(a.y,...
Definition: vec.cpp:35
GLuint make_vec2_texture(const int unit, const int width, const int height, const GLenum texel_type)
creation de textures pour stocker des donnees (autres qu'une couleur).
Definition: texture.cpp:171
int capture(const char *prefix)
Definition: texture.cpp:215
GLuint make_texture(const int unit, const int width, const int height, const GLenum texel_type, const GLenum data_format, const GLenum data_type)
creation de textures filtrables / mipmaps
Definition: texture.cpp:25
int screenshot(const char *filename)
enregistre le contenu de la fenetre dans un fichier. doit etre de type .png / .bmp
Definition: texture.cpp:188
GLuint make_vec3_texture(const int unit, const int width, const int height, const GLenum texel_type)
creation de textures pour stocker des donnees (autres qu'une couleur).
Definition: texture.cpp:176
GLuint make_float_texture(const int unit, const int width, const int height, const GLenum texel_type)
creation de textures pour stocker des donnees (autres qu'une couleur).
Definition: texture.cpp:166
GLuint make_vec4_texture(const int unit, const int width, const int height, const GLenum texel_type)
creation de textures pour stocker des donnees (autres qu'une couleur).
Definition: texture.cpp:181
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition: texture.cpp:148
int miplevels(const int width, const int height)
renvoie le nombre de mipmap d'une image width x height.
Definition: texture.cpp:10
GLuint make_flat_texture(const int unit, const int width, const int height, const GLenum texel_type, const GLenum data_format, const GLenum data_type)
creation de textures non filtrables / 1 mipmap
Definition: texture.cpp:49
GLuint make_uint_texture(const int unit, const int width, const int height, const GLenum texel_type)
creation de textures pour stocker des donnees (autres qu'une couleur).
Definition: texture.cpp:161
GLuint make_depth_texture(const int unit, const int width, const int height, const GLenum texel_type)
creation de textures pour stocker des donnees (autres qu'une couleur).
Definition: texture.cpp:156
stockage temporaire des donnees d'une image.
Definition: image_io.h:38