|
Nouveau Membre du Club
Lycéen Inscription : avril 2011 Messages : 83 Détails du profil  Informations personnelles : Sexe :  Localisation : France, Meurthe et Moselle (Lorraine) Informations professionnelles :
Activité : Lycéen Secteur : High Tech - Éditeur de logiciels Informations forums :
Inscription : avril 2011 Messages : 83 Points : 32 Points : 32
|
Problème de couleur
Bonjour à tous 
Pour faire simple je me heurte à un problème très bizarre. En effet, j'ai crée une classe vbo qui permet simplement de "lier" les vector d'indice, de position, de couleur et de coordonnées de texture et d'afficher l'objet.
La classe "marche" comme prévu lorsqu'on passe en paramètres un tableau d'index, de pos, ... : http://www.developpez.net/forums/att...1&d=1327796764
Code :
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
std::vector<int> element;
std::vector<double> pos;
std::vector<double> color;
std::vector<double> text;
element.push_back(0);
element.push_back(1);
element.push_back(2);
element.push_back(3);
element.push_back(0);
element.push_back(1);
element.push_back(5);
element.push_back(4);
element.push_back(1);
element.push_back(2);
element.push_back(6);
element.push_back(5);
element.push_back(2);
element.push_back(3);
element.push_back(7);
element.push_back(6);
element.push_back(3);
element.push_back(0);
element.push_back(4);
element.push_back(7);
element.push_back(4);
element.push_back(5);
element.push_back(6);
element.push_back(7);
pos.push_back(0.f);
pos.push_back(0.f);
pos.push_back(0.f);
pos.push_back(1.f);
pos.push_back(0.f);
pos.push_back(0.f);
pos.push_back(1.f);
pos.push_back(1.f);
pos.push_back(0.f);
pos.push_back(0.f);
pos.push_back(1.f);
pos.push_back(0.f);
pos.push_back(0.f);
pos.push_back(0.f);
pos.push_back(1.f);
pos.push_back(1.f);
pos.push_back(0.f);
pos.push_back(1.f);
pos.push_back(1.f);
pos.push_back(1.f);
pos.push_back(1.f);
pos.push_back(0.f);
pos.push_back(1.f);
pos.push_back(1.f);
color.push_back(255);
color.push_back(255);
color.push_back(255);
color.push_back(0);
color.push_back(170);
color.push_back(0);
color.push_back(255);
color.push_back(255);
color.push_back(0);
color.push_back(0);
color.push_back(0);
color.push_back(255);
color.push_back(0);
color.push_back(255);
color.push_back(255);
color.push_back(1);
color.push_back(255);
color.push_back(1);
color.push_back(180);
color.push_back(0);
color.push_back(180);
color.push_back(0);
color.push_back(0);
color.push_back(150);
text.push_back(0.f);
text.push_back(0.f);
text.push_back(0.f);
text.push_back(8.f);
text.push_back(8.f);
text.push_back(8.f);
text.push_back(8.f);
text.push_back(0.f);
text.push_back(0.f);
text.push_back(0.f);
text.push_back(8.f);
text.push_back(0.f);
text.push_back(0.f);
text.push_back(8.f);
text.push_back(8.f);
text.push_back(8.f);
m_allVbos.push_back(new VBO(element,pos,color,text,m_allTextures->getTextureN("myTexture"))); |
Cependant, lorsque j'enlève les coordonnées de texture ou que j'en supprime seulement quelques unes, les couleurs ne sont plus affichées sur le cube :
http://www.developpez.net/forums/att...1&d=1327797068
Ce n'est pas le cas dans le sens "opposé" (pas de tableau de couleurs) :
http://www.developpez.net/forums/att...1&d=1327834310
Je n'ai aucune idée du pourquoi du comment et je poste mon code que je compléterai demain par des explications car il est un peu "lourd" même si assez explicite :
Code :
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
#include "vbo.hpp"
VBO::VBO(std::vector<int> &elementBuffer, std::vector<double> &vertexBuffer, std::vector<double> &colorBuffer, std::vector<double> &texCoordBuffer,
Texture *texture, const int numberCoordVertexMember, const int numberColorMember, const int numberTexCoordVertexMember) :
m_bindColor(true),
m_bindTexture(true),
m_texture(texture),
m_numberCoordVertexMember(numberCoordVertexMember),
m_numberColorMember(numberColorMember),
m_numberTexCoordVertexMember(numberTexCoordVertexMember)
{
m_elementBuffer = elementBuffer;
m_vertexBuffer = vertexBuffer;
m_colorBuffer = colorBuffer;
m_texCoordBuffer = texCoordBuffer;
if(!m_colorBuffer.size())
m_bindColor = false;
if(!m_texCoordBuffer.size())
m_bindTexture = false;
glGenBuffers(4,m_numberVBO);
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*m_vertexBuffer.size(), &(m_vertexBuffer[0]), GL_DYNAMIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_numberVBO[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*m_elementBuffer.size(), &(m_elementBuffer[0]), GL_DYNAMIC_DRAW);
if(m_bindColor)
{
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*m_colorBuffer.size(), &(m_colorBuffer[0]), GL_DYNAMIC_DRAW);
}
if(m_bindTexture)
{
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[3]);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*m_texCoordBuffer.size(),&(m_texCoordBuffer[0]), GL_DYNAMIC_DRAW);
}
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
void VBO::draw()
{
if(m_texture!=NULL)
if(m_numberTexCoordVertexMember == 2)
glBindTexture(GL_TEXTURE_2D, m_texture->getTextureNumber());
else if(m_numberTexCoordVertexMember == 3)
glBindTexture(GL_TEXTURE_3D, m_texture->getTextureNumber());
else if(m_numberTexCoordVertexMember == 1)
glBindTexture(GL_TEXTURE_1D, m_texture->getTextureNumber());
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[0]);
glVertexPointer(m_numberCoordVertexMember, GL_DOUBLE, 0,((double*)NULL + (0)));
if(m_bindColor)
{
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[2]);
glColorPointer(m_numberColorMember, GL_DOUBLE, 0, ((double*)NULL + (0)));
}
if(m_bindTexture)
{
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[3]);
glTexCoordPointer(m_numberTexCoordVertexMember, GL_DOUBLE, 0, ((double*)NULL + (0)));
}
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_numberVBO[1]);
glEnableClientState(GL_VERTEX_ARRAY);
if(m_bindColor)
glEnableClientState(GL_COLOR_ARRAY);
if(m_bindTexture)
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawElements(GL_QUADS, m_elementBuffer.size(), GL_UNSIGNED_INT, ((int*)NULL + (0)));
if(m_bindColor)
glDisableClientState(GL_COLOR_ARRAY);
if(m_bindTexture)
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
}
void VBO::setElementBuffer(std::vector<int> &buffer)
{
m_elementBuffer = buffer;
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_numberVBO[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*m_elementBuffer.size(), &(m_elementBuffer[0]), GL_DYNAMIC_DRAW);
}
void VBO::setVertexBuffer(std::vector<double> &buffer)
{
m_vertexBuffer = buffer;
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*m_vertexBuffer.size(), &(m_vertexBuffer[0]), GL_DYNAMIC_DRAW);
}
void VBO::setColorBuffer(std::vector<double> &buffer)
{
m_colorBuffer = buffer;
if(m_bindColor)
{
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*m_colorBuffer.size(), &(m_colorBuffer[0]), GL_DYNAMIC_DRAW);
}
}
void VBO::setTexCoordBuffer(std::vector<double> &buffer)
{
m_texCoordBuffer = buffer;
if(m_bindTexture)
{
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[3]);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*m_texCoordBuffer.size(),&(m_texCoordBuffer[0]), GL_DYNAMIC_DRAW);
}
}
void VBO::addElementBuffer(int elementBuffer)
{
m_elementBuffer.push_back(elementBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_numberVBO[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*m_elementBuffer.size(), &(m_elementBuffer[0]), GL_DYNAMIC_DRAW);
}
void VBO::addVertexBuffer(double vertexBuffer)
{
m_vertexBuffer.push_back(vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*m_vertexBuffer.size(), &(m_vertexBuffer[0]), GL_DYNAMIC_DRAW);
}
void VBO::addColorBuffer(double colorBuffer)
{
m_colorBuffer.push_back(colorBuffer);
if(m_bindColor)
{
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*m_colorBuffer.size(), &(m_colorBuffer[0]), GL_DYNAMIC_DRAW);
}
}
void VBO::addTexCoordBuffer(double textCoordBuffer)
{
m_texCoordBuffer.push_back(textCoordBuffer);
if(m_bindTexture)
{
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[3]);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*m_texCoordBuffer.size(),&(m_texCoordBuffer[0]), GL_DYNAMIC_DRAW);
}
} |
Dans le constructeur :
Code :
1 2 3 4 5
|
m_elementBuffer = elementBuffer;
m_vertexBuffer = vertexBuffer;
m_colorBuffer = colorBuffer;
m_texCoordBuffer = texCoordBuffer; |
Les vector passés en paramètre du constructeur sont copiés dans les vector de la classe afin de pouvoir être modifié plus tard.
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
glGenBuffers(4,m_numberVBO);
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*m_vertexBuffer.size(), &(m_vertexBuffer[0]), GL_DYNAMIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_numberVBO[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*m_elementBuffer.size(), &(m_elementBuffer[0]), GL_DYNAMIC_DRAW);
if(m_bindColor)
{
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*m_colorBuffer.size(), &(m_colorBuffer[0]), GL_DYNAMIC_DRAW);
}
if(m_bindTexture)
{
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[3]);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*m_texCoordBuffer.size(),&(m_texCoordBuffer[0]), GL_DYNAMIC_DRAW);
}
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); |
On génère les 4 buffers et on les remplit en indiquant la taille des vector et l'adresse du premier élément de chaque vector, les données étant contigues, le buffer est bien rempli.
Pour l'affichage :
Code :
1 2 3 4 5 6 7 8
|
if(m_texture!=NULL)
if(m_numberTexCoordVertexMember == 2)
glBindTexture(GL_TEXTURE_2D, m_texture->getTextureNumber());
else if(m_numberTexCoordVertexMember == 3)
glBindTexture(GL_TEXTURE_3D, m_texture->getTextureNumber());
else if(m_numberTexCoordVertexMember == 1)
glBindTexture(GL_TEXTURE_1D, m_texture->getTextureNumber()); |
On bind la texture si elle existe.
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[0]);
glVertexPointer(m_numberCoordVertexMember, GL_DOUBLE, 0,((double*)NULL + (0)));
if(m_bindColor)
{
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[2]);
glColorPointer(m_numberColorMember, GL_DOUBLE, 0, ((double*)NULL + (0)));
}
if(m_bindTexture)
{
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[3]);
glTexCoordPointer(m_numberTexCoordVertexMember, GL_DOUBLE, 0, ((double*)NULL + (0)));
}
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_numberVBO[1]); |
On bind tous les buffers crées dans le constructeur si il y a besoin.
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
glEnableClientState(GL_VERTEX_ARRAY);
if(m_bindColor)
glEnableClientState(GL_COLOR_ARRAY);
if(m_bindTexture)
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawElements(GL_QUADS, m_elementBuffer.size(), GL_UNSIGNED_INT, ((int*)NULL + (0)));
if(m_bindColor)
glDisableClientState(GL_COLOR_ARRAY);
if(m_bindTexture)
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY); |
On appelle glDrawElements avec un nombre de points affichés égal à la taille du tableau d'indices.
Voila pour le code.
En ce qui concerne le débogage avec gDEBugger, aucun problème n'est généré, que ce soit lorsqu'on passe ou non un tableau de coordonnées de texture. De plus, les buffers sont corrects, rien n'est changé. Cependant, je ne sais pas si cela constitue une "piste", mais le depth buffer présente un cube noir. Cependant, je ne sais pas ce qu'il représente. Pouvez-vous m'éclairer ? Ou m'apporter des pistes ?
|