gKit2 light
Loading...
Searching...
No Matches
tuto_uniform_buffers.cpp File Reference

alignement des donnees / uniform buffers. More...

#include <cstddef>
#include <cassert>
#include <vector>
#include "window.h"
#include "vec.h"
#include "color.h"
#include "program.h"

Go to the source code of this file.

Classes

struct  glsl::gscalar< T >
struct  glsl::gvec2< T >
struct  glsl::gvec3< T >
struct  glsl::gvec4< T >
struct  glsl::array::gscalar< T >
struct  glsl::array::gvec2< T >
struct  glsl::array::gvec3< T >
struct  glsl::array::gvec4< T >

Typedefs

typedef gscalar< float > glsl::array::gfloat
typedef gscalar< int > glsl::array::gint
typedef gscalar< unsigned int > glsl::array::guint
typedef gscalar< bool > glsl::array::gbool
typedef gvec2< float > glsl::array::vec2
typedef gvec2< int > glsl::array::ivec2
typedef gvec2< unsigned int > glsl::array::uvec2
typedef gvec2< int > glsl::array::bvec2
typedef gvec3< float > glsl::array::vec3
typedef gvec3< int > glsl::array::ivec3
typedef gvec3< unsigned int > glsl::array::uvec3
typedef gvec3< int > glsl::array::bvec3
typedef gvec4< float > glsl::array::vec4
typedef gvec4< int > glsl::array::ivec4
typedef gvec4< unsigned int > glsl::array::uvec4
typedef gvec4< int > glsl::array::bvec4

Functions

const char * glsl_string (const GLenum type)
int print_uniform (const GLuint program)
int init ()
int quit ()
int main (int argc, char **argv)

Variables

GLuint program

Detailed Description

alignement des donnees / uniform buffers.

Definition in file tuto_uniform_buffers.cpp.

Typedef Documentation

◆ gfloat

typedef gscalar<float> glsl::array::gfloat

Definition at line 111 of file tuto_uniform_buffers.cpp.

◆ gint

typedef gscalar<int> glsl::array::gint

Definition at line 112 of file tuto_uniform_buffers.cpp.

◆ guint

typedef gscalar<unsigned int> glsl::array::guint

Definition at line 113 of file tuto_uniform_buffers.cpp.

◆ gbool

typedef gscalar<bool> glsl::array::gbool

Definition at line 114 of file tuto_uniform_buffers.cpp.

◆ vec2

typedef gvec2<float> glsl::array::vec2

Definition at line 129 of file tuto_uniform_buffers.cpp.

◆ ivec2

typedef gvec2<int> glsl::array::ivec2

Definition at line 130 of file tuto_uniform_buffers.cpp.

◆ uvec2

typedef gvec2<unsigned int> glsl::array::uvec2

Definition at line 131 of file tuto_uniform_buffers.cpp.

◆ bvec2

typedef gvec2<int> glsl::array::bvec2

Definition at line 132 of file tuto_uniform_buffers.cpp.

◆ vec3

typedef gvec3<float> glsl::array::vec3

Definition at line 151 of file tuto_uniform_buffers.cpp.

◆ ivec3

typedef gvec3<int> glsl::array::ivec3

Definition at line 152 of file tuto_uniform_buffers.cpp.

◆ uvec3

typedef gvec3<unsigned int> glsl::array::uvec3

Definition at line 153 of file tuto_uniform_buffers.cpp.

◆ bvec3

typedef gvec3<int> glsl::array::bvec3

Definition at line 154 of file tuto_uniform_buffers.cpp.

◆ vec4

typedef gvec4<float> glsl::array::vec4

Definition at line 170 of file tuto_uniform_buffers.cpp.

◆ ivec4

typedef gvec4<int> glsl::array::ivec4

Definition at line 171 of file tuto_uniform_buffers.cpp.

◆ uvec4

typedef gvec4<unsigned int> glsl::array::uvec4

Definition at line 172 of file tuto_uniform_buffers.cpp.

◆ bvec4

typedef gvec4<int> glsl::array::bvec4

Definition at line 173 of file tuto_uniform_buffers.cpp.

Function Documentation

◆ glsl_string()

const char * glsl_string ( const GLenum type)

Definition at line 180 of file tuto_uniform_buffers.cpp.

181{
182 switch(type)
183 {
184 case GL_BOOL:
185 return "bool";
186 case GL_UNSIGNED_INT:
187 return "uint";
188 case GL_INT:
189 return "int";
190 case GL_FLOAT:
191 return "float";
192 case GL_FLOAT_VEC2:
193 return "vec2";
194 case GL_FLOAT_VEC3:
195 return "vec3";
196 case GL_FLOAT_VEC4:
197 return "vec4";
198 case GL_FLOAT_MAT3:
199 return "mat3";
200 case GL_FLOAT_MAT4:
201 return "mat4";
202
203 default:
204 return "";
205 }
206}

◆ print_uniform()

int print_uniform ( const GLuint program)

Definition at line 208 of file tuto_uniform_buffers.cpp.

209{
210 if(program == 0)
211 {
212 printf("[error] program 0, no buffers...\n");
213 return -1;
214 }
215
216 // recupere le nombre d'uniform buffers
217 GLint buffer_count= 0;
218 glGetProgramiv(program, GL_ACTIVE_UNIFORM_BLOCKS, &buffer_count);
219
220 for(int i= 0; i < buffer_count; i++)
221 {
222 // recupere le nom du block et son indice
223 char bname[1024]= { 0 };
224 glGetActiveUniformBlockName(program, i, sizeof(bname), nullptr, bname);
225
226 GLint binding= 0;
227 glGetActiveUniformBlockiv(program, i, GL_UNIFORM_BLOCK_BINDING, &binding);
228
229 printf(" uniform '%s' binding %d\n", bname, binding);
230
231 GLint variable_count= 0;
232 glGetActiveUniformBlockiv(program, i, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &variable_count);
233
234 std::vector<GLint> variables(variable_count);
235 glGetActiveUniformBlockiv(program, i, GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, variables.data());
236 for(int k= 0; k < variable_count; k++)
237 {
238 // recupere chaque info... une variable a la fois,
239 GLint glsl_type= 0;
240 glGetActiveUniformsiv(program, 1, (GLuint *) &variables[k], GL_UNIFORM_TYPE, &glsl_type);
241 GLint offset= 0;
242 glGetActiveUniformsiv(program, 1, (GLuint *) &variables[k], GL_UNIFORM_OFFSET, &offset);
243
244 GLint array_size= 0;
245 glGetActiveUniformsiv(program, 1, (GLuint *) &variables[k], GL_UNIFORM_SIZE, &array_size);
246 GLint array_stride= 0;
247 glGetActiveUniformsiv(program, 1, (GLuint *) &variables[k], GL_UNIFORM_ARRAY_STRIDE, &array_stride);
248
249 GLint matrix_stride= 0;
250 glGetActiveUniformsiv(program, 1, (GLuint *) &variables[k], GL_UNIFORM_MATRIX_STRIDE, &matrix_stride);
251 GLint matrix_row_major= 0;
252 glGetActiveUniformsiv(program, 1, (GLuint *) &variables[k], GL_UNIFORM_IS_ROW_MAJOR, &matrix_row_major);
253
254 // nom de la variable
255 char vname[1024]= { 0 };
256 glGetActiveUniformName(program, variables[k], sizeof(vname), nullptr, vname);
257
258 printf(" '%s %s': offset %d", glsl_string(glsl_type), vname, offset);
259 if(array_size > 1)
260 printf(", array size %d, stride %d", array_size, array_stride);
261
262 // organisation des matrices
263 if(glsl_type == GL_FLOAT_MAT4 || glsl_type == GL_FLOAT_MAT3)
264 printf(", %s, matrix stride %d", matrix_row_major ? "row major" : "column major", matrix_stride);
265
266 printf("\n");
267 }
268
269 GLint buffer_size= 0;
270 glGetActiveUniformBlockiv(program, i, GL_UNIFORM_BLOCK_DATA_SIZE, &buffer_size);
271 printf(" buffer size %d\n\n", buffer_size);
272 }
273
274 return 0;
275}
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

◆ init()

int init ( )

Definition at line 280 of file tuto_uniform_buffers.cpp.

281{
282 // compile le shader program, le program est selectionne
283 program= read_program("gkit2_tutos/uniform.glsl");
284 program_print_errors(program);
285
286 // affiche l'organisation memoire des uniforms
287 print_uniform(program);
288
289 struct buffer
290 {
291 glsl::vec2 a;
292 glsl::vec3 b;
293 glsl::vec4 c;
294 glsl::array::vec2 d[3];
295
296 //~ vec2 a; // align 4
297 //~ float pad0;
298 //~ float pad1;
299 //~ vec3 b; // align 16
300 //~ float pad2;
301 //~ vec4 c; // align 16
302 //~ struct { vec2 v; float pad0; float pad1; } d[3]; // d[i].v align 16
303
304 //~ vec2 a;
305 //~ vec3 b;
306 //~ vec4 c;
307 //~ vec2 d[3];
308 };
309
310 printf("a %ld\n", offsetof(buffer, a));
311 printf("a.x %ld\n", offsetof(buffer, a.x));
312 printf("a.y %ld\n", offsetof(buffer, a.y));
313
314 printf("b %ld\n", offsetof(buffer, b));
315 printf("b.x %ld\n", offsetof(buffer, b.x));
316 printf("b.y %ld\n", offsetof(buffer, b.y));
317 printf("b.z %ld\n", offsetof(buffer, b.z));
318
319 printf("c %ld\n", offsetof(buffer, c));
320 printf("c.x %ld\n", offsetof(buffer, c.x));
321 printf("c.y %ld\n", offsetof(buffer, c.y));
322 printf("c.z %ld\n", offsetof(buffer, c.z));
323 printf("c.w %ld\n", offsetof(buffer, c.w));
324
325 printf("d %ld\n", offsetof(buffer, d));
326 printf("d[0] %ld\n", offsetof(buffer, d[0]));
327 printf("d[1] %ld\n", offsetof(buffer, d[1]));
328 printf("d[2] %ld\n", offsetof(buffer, d[2]));
329
330 buffer B;
331 B.a= vec2(1, 2);
332 B.d[0]= vec2(3, 4);
333 B.d[1]= B.d[0];
334
335 //~ vec2 d0= B.d[0];
336 vec2 d0= B.d[1];
337 printf("%f %f\n", d0.x, d0.y);
338 return 0;
339}
GLuint read_program(const char *filename, const char *definitions)
Definition program.cpp:217
int program_print_errors(const GLuint program, const char *filename)
affiche les erreurs de compilation.
Definition program.cpp:461
vecteur generique, utilitaire.
Definition vec.h:152

◆ quit()

int quit ( )

Definition at line 341 of file tuto_uniform_buffers.cpp.

342{
343 release_program(program);
344 return 0;
345}
int release_program(const GLuint program)
detruit les shaders et le program.
Definition program.cpp:240

◆ main()

int main ( int argc,
char ** argv )

Definition at line 348 of file tuto_uniform_buffers.cpp.

349{
350 // etape 1 : creer la fenetre
351 Window window= create_window(1024, 640);
352 if(window == nullptr)
353 return 1;
354
355 // etape 2 : creer un contexte opengl pour pouvoir dessiner
356 Context context= create_context(window);
357 if(context == nullptr)
358 return 1;
359
360 // etape 3 : creation des objets
361 if(init() < 0)
362 {
363 printf("[error] init failed.\n");
364 return 1;
365 }
366
367 // etape 5 : nettoyage
368 quit();
369 release_context(context);
370 release_window(window);
371 return 0;
372}
Context create_context(Window window)
cree et configure un contexte opengl
Definition window.cpp:358
void release_window(Window window)
destruction de la fenetre.
Definition window.cpp:328
Window create_window(const int w, const int h, const int major, const int minor)
creation d'une fenetre pour l'application.
Definition window.cpp:262
void release_context(Context context)
detruit le contexte openGL.
Definition window.cpp:439
int init(std::vector< const char * > &options)

Variable Documentation

◆ program

GLuint program

Definition at line 278 of file tuto_uniform_buffers.cpp.