[OpenGL] Quadrics et VBO

Le côté programmation du développement d'un jeu vidéo.

Quadrics et VBO

Messagepar Kremtak » 11 Nov 2010, 22:16

Salut,

Je cherche une fonction méga simple du type "gluCylinder" pour dessiner des quadriques (en l'occurrence un cylindre), mais en utilisant les VBO. Est-ce que ça existe dans les libraries GL (j'ai l'impression que non), ou connaissez-vous des exemples de code pour ça?
Merci !
But there's no sense crying over every mistake
You just keep trying until you run out of cake
Avatar de l’utilisateur
Kremtak
Hello World, I'm new !
 
Messages: 167
Inscription: 12 Déc 2007, 23:27
Localisation: Aubagne

Messagepar NewbiZ » 12 Nov 2010, 14:33

Des fois, il est bon de mettre la main à la pâte :)
~ Passer pour un idiot aux yeux d'un imbécile est une volupté de fin gourmet ~
Avatar de l’utilisateur
NewbiZ
 
Messages: 1265
Inscription: 02 Juin 2005, 22:25
Localisation: Tallinn / Estonie

Messagepar Kremtak » 12 Nov 2010, 15:37

Bon j'avoue, j'étais en mode fainéant, ça se fait en 10 minutes :D

Ceci dit je suis pas radin et je pense aux autres fainéants, si ça intéresse quelqu'un :

=> Construction du vbo (j'utilise 2 vbo : un pour le disque (affiché 2 fois), un pour le tour ; 3 paramètres d'entrée : diamètre du cylindre, hauteur et nombre de tranches. Le cylindre est centré sur l'axe Z, la base étant sur z=0)
Ma fonction Vertex::set prend en paramètres x, y, z, u, v
Code: Tout sélectionner

  glGenBuffers(1, &m_VboId);
  glBindBuffer(GL_ARRAY_BUFFER, m_VboId);

  Vertex * pBase = new Vertex[m_uSlices+2];  // triangle fan
  float fAlpha = 2.0f*PI/(float)m_uSlices;
  float fRadius = m_fDiameter / 2.0f;
  // Set origin vertex for triangle fan
  pBase[0].set(0, 0, 0, 0.5f, 0.5f);
  // Next vertice
  for (int i = 0; i < m_uSlices; i++)
    pBase[i+1].set(fRadius*cos(i*fAlpha), fRadius*sin(i*fAlpha), 0.0f, (1.0f + cos(i*fAlpha)) / 2.0f, (1.0f + sin(i*fAlpha)) / 2.0f);
  // Close shape
  pBase[m_uSlices+1].set(fRadius, 0.0f, 0.0f, 1.0f, 0.5f);

  glBufferData(GL_ARRAY_BUFFER, (m_uSlices+2) * sizeof(Vertex), pBase, glType);

  // Now do quad strip for borders
  glGenBuffers(1, &m_BordersVboId);
  glBindBuffer(GL_ARRAY_BUFFER, m_BordersVboId);
  Vertex * pBorders = new Vertex[2*m_uSlices+4];  // quad strip

  // Set the 2 first vertice for quad strip
  pBorders[0].set(fRadius, 0, 0, 0, 0);
  pBorders[1].set(fRadius, 0, m_fHeight, 0, 0);
  // Next vertice
  for (int i = 0; i < m_uSlices; i++)
  {
    pBorders[2*i+2].set(fRadius*cos(i*fAlpha), fRadius*sin(i*fAlpha), 0.0f, 0, 0);
    pBorders[2*i+3].set(fRadius*cos(i*fAlpha), fRadius*sin(i*fAlpha), m_fHeight, 0, 0);
  }
  // Close shape
  pBorders[2*m_uSlices+2].set(fRadius, 0, 0, 0, 0);
  pBorders[2*m_uSlices+3].set(fRadius, 0, m_fHeight, 0, 0);

  glBufferData(GL_ARRAY_BUFFER, (2*m_uSlices+4) * sizeof(Vertex), pBorders, glType);

  delete[] pBase;
  delete[] pBorders;


Et l'affichage donne quelque chose comme ça :
Code: Tout sélectionner
  glEnableClientState(GL_VERTEX_ARRAY);
  glEnableClientState(GL_TEXTURE_COORD_ARRAY);

  glBindBuffer(GL_ARRAY_BUFFER, m_BordersVboId);
  glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));
  glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(2 * sizeof(GLfloat)));
  glDrawArrays(GL_QUAD_STRIP, 0, 2*m_uSlices+4);

  glEnable(GL_TEXTURE_2D);
  glBindBuffer(GL_ARRAY_BUFFER, m_VboId);
  glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));
  glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(2 * sizeof(GLfloat)));
  glBindTexture(GL_TEXTURE_2D, m_pDisplay->getTextureEngine()->getTexture(m_iTex)->m_uGlId);
  glDrawArrays(GL_TRIANGLE_FAN, 0, m_uSlices+2);
  glTranslatef(0, 0, m_fHeight);
  glDrawArrays(GL_TRIANGLE_FAN, 0, m_uSlices+2);
  glTranslatef(0, 0, -m_fHeight);

  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  glDisableClientState(GL_VERTEX_ARRAY);
But there's no sense crying over every mistake
You just keep trying until you run out of cake
Avatar de l’utilisateur
Kremtak
Hello World, I'm new !
 
Messages: 167
Inscription: 12 Déc 2007, 23:27
Localisation: Aubagne

Messagepar Gavos » 12 Nov 2010, 16:45

Bon j'avoue, j'étais en mode fainéant, ça se fait en 10 minutes :D


Au contraire, ça anime la section OpenGL qui se met à revivre tout d'un coup depuis une semaine ^^
Gavos
 
Messages: 1076
Inscription: 19 Mar 2005, 13:00

Messagepar NewbiZ » 12 Nov 2010, 18:18

Gavos a écrit:Au contraire, ça anime la section OpenGL qui se met à revivre tout d'un coup depuis une semaine ^^

Tellement vrai, ca fait très plaisir de revenir actualiser la section en attente de réponses :D
~ Passer pour un idiot aux yeux d'un imbécile est une volupté de fin gourmet ~
Avatar de l’utilisateur
NewbiZ
 
Messages: 1265
Inscription: 02 Juin 2005, 22:25
Localisation: Tallinn / Estonie


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron