Précédent   Forum des professionnels en informatique > Applications > Développement 2D, 3D et Jeux > API graphiques > OpenGL
OpenGL Forum d'entraide sur le développement en OpenGL. Avant de poster -> FAQ OpenGL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/01/2012, 01h34   #1
Nouveau Membre du Club
 
Homme
Lycéen
Inscription : avril 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
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
Par défaut 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 ?
Images attachées
Type de fichier : png CubeTexturéVBO.png (151,0 Ko, 4 affichages)
Type de fichier : png CubeNonTexturéVBO.png (3,6 Ko, 4 affichages)
Type de fichier : png CubeTexturé2VBO.png (22,6 Ko, 4 affichages)
Lintel-oo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 23h50   #2
Nouveau Membre du Club
 
Homme
Lycéen
Inscription : avril 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
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
En fait problème résolu
Il s'agissait simplement d'un oubli de bind à 0 : il manquait cela à la fin de la fonction d'affichage :
Code :
1
2
3
4
 
glBindTexture(GL_TEXTURE_2D,0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ARRAY_BUFFER,0);
Quelle erreur bête perdre 1 journée rien que sur ça en testant tout et n'importe quoi enfin au moins je vais pouvoir dormir sereinement

Sujet résolu
Lintel-oo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h48.


 
 
 
 
Partenaires

Hébergement Web