38 glGenVertexArrays(1, &m_vao);
39 glBindVertexArray(m_vao);
42 glGenBuffers(1, &m_buffer);
43 glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
46 glBufferData(GL_ARRAY_BUFFER, size,
nullptr, GL_STATIC_DRAW);
51 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.
vertex_buffer());
53 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
54 glEnableVertexAttribArray(0);
57 offset= offset + size;
59 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.
normal_buffer());
61 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
62 glEnableVertexAttribArray(2);
68 std::vector<vec3> positions;
69 for(
int i= 0; i < 50; i++)
71 float x= rand() % 11 - 5;
72 float y= rand() % 11 - 5;
73 float z= rand() % 11 - 5;
75 positions.push_back(
vec3(x *4, y *4, z *4));
78 m_instance_count= (int) positions.size();
81 glGenBuffers(1, &m_instance_buffer);
82 glBindBuffer(GL_ARRAY_BUFFER, m_instance_buffer);
83 glBufferData(GL_ARRAY_BUFFER,
sizeof(
vec3) * positions.size(), &positions.front().x, GL_STATIC_DRAW);
87 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
88 glVertexAttribDivisor(1, 1);
89 glEnableVertexAttribArray(1);
94 glBindBuffer(GL_ARRAY_BUFFER, 0);
102 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
105 glDepthFunc(GL_LESS);
106 glEnable(GL_DEPTH_TEST);
115 glDeleteVertexArrays(1, &m_vao);
116 glDeleteBuffers(1, &m_buffer);
117 glDeleteBuffers(1, &m_instance_buffer);
121 int update(
const float time,
const float delta )
130 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
134 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
135 if(mb & SDL_BUTTON(1))
137 else if(mb & SDL_BUTTON(3))
139 else if(mb & SDL_BUTTON(2))
142 glBindVertexArray(m_vao);
143 glUseProgram(m_program);
154 glDrawArraysInstanced(GL_TRIANGLES, 0, m_vertex_count, m_instance_count);
164 GLuint m_instance_buffer;
167 int m_instance_count;
171 int main(
int argc,
char **argv )
const float * normal_buffer() const
renvoie l'adresse de la normale du premier sommet. par convention, la normale est un vec3...
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet...
int quit()
a deriver pour detruire les objets openGL.
const float * vertex_buffer() const
renvoie l'adresse de la position du premier sommet. permet de construire les vertex buffers openGL...
void bounds(Point &pmin, Point &pmax)
renvoie min et max les coordonnees des extremites des positions des sommets de l'objet (boite engloba...
vecteur generique, utilitaire.
int init()
a deriver pour creer les objets openGL.
std::size_t normal_buffer_size() const
renvoie la longueur (en octets) du normal buffer.
representation d'un objet / maillage.
void move(const float z)
rapproche / eloigne la camera du centre.
std::size_t vertex_buffer_size() const
renvoie la longueur (en octets) du vertex buffer.
int run()
execution de l'application.
void program_uniform(const GLuint program, const char *uniform, const unsigned int v)
affecte une valeur a un uniform du shader program. uint.
Transform view() const
renvoie la transformation vue.
int window_width()
renvoie la largeur de la fenetre de l'application.
representation d'un vecteur 3d.
void release()
detruit les objets openGL.
Transform projection(const float width, const float height, const float fov) const
renvoie la projection reglee pour une image d'aspect width / height, et une ouverture de fov degres...
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
void lookat(const Point ¢er, const float size)
observe le point center a une distance size.
App(const int width, const int height, const int major=3, const int minor=3)
constructeur, dimensions de la fenetre et version d'openGL.
GLuint read_program(const char *filename, const char *definitions)
int render()
a deriver pour afficher les objets.
void translation(const float x, const float y)
deplace le centre / le point observe.
int update(const float time, const float delta)
a deriver et redefinir pour animer les objets en fonction du temps.
void rotation(const float x, const float y)
change le point de vue / la direction d'observation.
int window_height()
renvoie la hauteur de la fenetre de l'application.
int release_program(const GLuint program)
detruit les shaders et le program.
representation d'un point 3d.
int vertex_count() const
renvoie le nombre de sommets.
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes. utiliser glDrawArrays pour l'afficher. a detruire avec Mesh::release( ).