Bonjour a tous !
Comme dit dans le titre, lorsque j'appelle glGetError, il me renvoie une erreur juste apres un glEnd(). Je ne pense pas que le probleme vienne de la mais plus tot dans mon code. Je suis en train de tenter d'installer une skybox comme dans le tuto de developpez fait par raptor. Je vous explique les differentes etapes par lesquelles je suis passe, ca vous aidera peut-etre a voir ou je me suis plante.
Tout d'abord j'avais fait une skybox de la taille de la distance de vue -1 qui se deplacait en meme temps que la camera. Petit probleme cependant, les aretes du cube se voyaient. Pas tip top donc. J'ai commence le tutoriel de raptor a ce moment-la.
Apres quelques temps d'essais plus ou moins foireux, je finis par voir le bout d'une skybox mais totalement buggee (les textures tournent etrangement...). A force de chercher le probleme, j'ai vu qu'il y avait un probleme avec gluLookAt, il etait positionne avant l'appel a glLoad(GL_MODELVIEW). J'ai donc change sa position et l'ai positionne apres. Seulement voila, depuis ce changement, seule la skybox bouge et la position de ma camera reste en (0, 0, 0) alors qu'avant il n'y avait aucun probleme. J'ai donc cherche d'ou pouvait venir mon erreur mais rien a faire. J'ai donc fait appel a glGetError. Et la, surprise ! OpenGL semble detester le glEnd de mon cube (cela dit je pense que le probleme serait le meme avec une autre figure).
Donc je vais vous donner le code de ma camera pour commencer :
Les differents appels d'OpenGL avant la methode look() de la camera sont faits dans la classe MyWindow. Je ne vais mettre que le code qui nous interesse :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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204 Camera::Camera() : m_speed(1.f), m_sensivity(0.2f), m_phi(0.f), m_theta(270.f), m_position(-45.f, 22.f, 0.f), m_up(0.f, 1.f, 0.f), m_target(0.f, 10.f, 0.f), m_win(0), m_oldX(0), m_oldY(0), m_y(m_position.y()), tmpSpeed(1.f) { distanceView = 1000.0f; m_skybox = new SkyBox(distanceView); m_skybox->initializeGL(); m_mutex = new HandleMutex; vectorsFromAngles(); } Camera::~Camera() { if (m_skybox) delete m_skybox; if (m_mutex) delete m_mutex; } float const &Camera::getDistanceView() const { return distanceView; } void Camera::resize(int w, int h) { MyMutexLocker l(m_mutex); (void)l; if (h == 0) h = 1; m_ratio = (float)w / (float)h; m_curX = w / 2; m_curY = h / 2; m_oldX = m_curX; m_oldY = m_curY; glViewport(0, 0, w, h); } void Camera::look() { MyMutexLocker l(m_mutex); (void)l; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(70.0f, m_ratio, 1.0f, distanceView); /*gluLookAt(m_position.x(), m_position.y(), m_position.z(), m_target.x(), m_target.y(), m_target.z(), 0.f, 1.f, 0.f);*/ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(m_position.x(), m_position.y(), m_position.z(), m_target.x(), m_target.y(), m_target.z(), 0.f, 1.f, 0.f); m_skybox->paintGL(m_theta, m_phi); } void Camera::mouseMoveEvent(SDL_MouseMotionEvent *ev) { MyMutexLocker l(m_mutex); (void)l; m_oldX = (m_oldX - ev->x); m_oldY = (ev->y - m_oldY); if (m_oldX > 100 || m_oldX < -100 || m_oldY > 100 || m_oldY < -100) { m_oldX = ev->x; m_oldY = ev->y; return; } m_theta -= m_oldX * m_sensivity; m_phi -= m_oldY * m_sensivity; vectorsFromAngles(); m_oldX = ev->x; m_oldY = ev->y; } void Camera::keyPressEvent(int ev) { MyMutexLocker l(m_mutex); (void)l; switch (ev) { case SDLK_a: m_position = m_position + (m_left * m_speed * tmpSpeed); m_target = m_position + m_forward; break; case SDLK_d: m_position = m_position - (m_left * m_speed * tmpSpeed); m_target = m_position + m_forward; break; case SDLK_w: m_position += (m_forward * m_speed * tmpSpeed); m_position.setY(m_y); break; case SDLK_s: m_position -= (m_forward * m_speed * tmpSpeed); m_position.setY(m_y); break; case SDLK_SPACE: m_y += (m_speed * tmpSpeed); m_position.setY(m_y); break; case SDLK_LCTRL: m_y -= (m_speed * tmpSpeed); m_position.setY(m_y); break; case SDLK_LSHIFT: if (tmpSpeed < 2.f) tmpSpeed = 2.f; break; default: return; } vectorsFromAngles(); } void Camera::keyReleaseEvent(int e) { MyMutexLocker l(m_mutex); (void)l; switch (e) { case SDLK_LSHIFT: //42 if (tmpSpeed > 1.f) tmpSpeed = 1.f; break; } } void Camera::setSpeed(float s) { MyMutexLocker l(m_mutex); (void)l; m_speed = s; } void Camera::setsensivity(float s) { MyMutexLocker l(m_mutex); (void)l; m_sensivity = s; } void Camera::setPosition(const Vector3D &position) { MyMutexLocker l(m_mutex); (void)l; m_position = position; m_target = m_position + m_forward; } void Camera::vectorsFromAngles() { if (m_phi > 89.f) m_phi = 89.f; else if (m_phi < -89.f) m_phi = -89.f; tmp1 = m_phi * M_PI / 180.f; tmp2 = m_theta * M_PI / 180.f; r_temp = cosf(tmp1); m_forward.setY(tmp1); m_forward.setX(r_temp * cosf(tmp2)); m_forward.setZ(r_temp * sinf(tmp2)); //m_forward.setY(0.f); /*m_left = Vector3D::crossProduct(m_up, m_forward); m_left.normalize();*/ m_target = (m_forward + m_position); tmp1 = 45.f * M_PI / 180.f; tmp2 = m_theta * M_PI / 180.f; r_temp = cosf(tmp1); m_forward.setY(tmp1); m_forward.setX(r_temp * cosf(tmp2)); m_forward.setZ(r_temp * sinf(tmp2)); //m_forward.setY(0.f); m_left = Vector3D::crossProduct(m_up, m_forward); m_left.normalize(); /**/ //m_skybox->setPosition(m_position); } Vector3D const &Camera::getPosition() const { return m_position; } void Camera::setView(MyWindow *v) { resize(v->getLib()->width(), v->getLib()->height()); }
Et enfin voici le code de mon cube :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 float fps; glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.f, 1.f, 1.f); m_camera->look(); /* 3D part */ if (this->m_test) for (WinList::iterator it = objectList.begin(); it != objectList.end(); ++it){ if ((*it)->canDraw(m_camera->getPosition(), m_camera->getDistanceView())) (*it)->paintGL(); } else for (WinList::iterator it = objectList.begin(); it != objectList.end(); ++it){ (*it)->paintGL(); } /* 2D part */ glDisable(GL_DEPTH_TEST); /*glPopMatrix(); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity();*/ gluOrtho2D(0.f, getLib()->width(), 0.f, getLib()->height()); for (WinList::iterator it = _2D_objectList.begin(); it != _2D_objectList.end(); ++it){ (*it)->paintGL(); } fps = this->m_fps->getFpsCount(); if (this->m_printInfo) { Object::Text::drawText(m_camera->getPosition().x(), 0.f, 0.f, 0.1f); Object::Text::drawText(m_camera->getPosition().y(), 0.f, 0.08f, 0.1f); Object::Text::drawText(m_camera->getPosition().z(), 0.f, 0.16f, 0.1f); Object::Text::drawText("FPS : " + Utility::toString<float>(fps), 0.f, 0.24f, 0.1f); } glPopMatrix(); glPopMatrix();
En temps normal je passe par des display lists mais pour les tests il me semblait plus evident de faire les appels a chaque fois. Donc l'affichage que l'on obtient a chaque fois est le suivant :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 HandleSDL::displayErrorMessage("IN", "lol"); glLoadIdentity(); glTranslatef(m_pos.x(), m_pos.y(), m_pos.z()); glRotatef(m_rot.getRotation(), m_rot.getRotX(), m_rot.getRotY(), m_rot.getRotZ()); //glCallList(m_glObject); if (m_hasTexture) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture[0]); glBegin(GL_QUADS); glNormal3f(-1.f, 0.f, 0.f); glColor3d(m_color.getRed(), m_color.getGreen(), m_color.getBlue()); glTexCoord2f(0.f, 1.f); glVertex3f(sizeX / -2.f, sizeY / -2.f, sizeZ / -2.f); glTexCoord2f(0.f, 0.f); glVertex3f(sizeX / -2.f, -sizeY / 2.f, sizeZ / 2.f); glTexCoord2f(1.f, 0.f); glVertex3f(sizeX / -2.f, sizeY / 2.f, sizeZ / 2.f); glTexCoord2f(1.f, 1.f); glVertex3f(sizeX / -2.f, sizeY / 2.f, sizeZ / -2.f); glNormal3f(0.f, 1.f, 0.f); glColor3d(m_color.getRed(), m_color.getGreen(), m_color.getBlue()); glTexCoord2f(0.f, 1.f); glVertex3f(sizeX / -2.f, sizeY / 2.f, sizeZ / -2.f); glTexCoord2f(0.f, 0.f); glVertex3f(sizeX / -2.f, sizeY / 2.f, sizeZ / 2.f); glTexCoord2f(1.f, 0.f); glVertex3f(sizeX / 2.f, sizeY / 2.f, sizeZ / 2.f); glTexCoord2f(1.f, 1.f); glVertex3f(sizeX / 2.f, sizeY / 2.f, sizeZ / -2.f); glNormal3f(1.f, 0.f, 0.f); glColor3d(m_color.getRed(), m_color.getGreen(), m_color.getBlue()); glTexCoord2f(0.f, 1.f); glVertex3f(sizeX / 2.f, sizeY / 2.f, sizeZ / -2.f); glTexCoord2f(0.f, 0.f); glVertex3f(sizeX / 2.f, sizeY / 2.f, sizeZ / 2.f); glTexCoord2f(1.f, 0.f); glVertex3f(sizeX / 2.f, sizeY / -2.f, sizeZ / 2.f); glTexCoord2f(1.f, 1.f); glVertex3f(sizeX / 2.f, sizeY / -2.f, sizeZ / -2.f); glNormal3f(0.f, -1.f, 0.f); glColor3d(m_color.getRed(), m_color.getGreen(), m_color.getBlue()); glTexCoord2f(0.f, 1.f); glVertex3f(sizeX / 2.f, sizeY / -2.f, sizeZ / -2.f); glTexCoord2f(0.f, 0.f); glVertex3f(sizeX / 2.f, sizeY / -2.f, sizeZ / 2.f); glTexCoord2f(1.f, 0.f); glVertex3f(sizeX / -2.f, -sizeY / 2.f, sizeZ / 2.f); glTexCoord2f(1.f, 1.f); glVertex3f(sizeX / -2.f, sizeY / -2.f, sizeZ / -2.f); glNormal3f(0.f, 0.f, 1.f); glColor3d(m_color.getRed(), m_color.getGreen(), m_color.getBlue()); glTexCoord2f(0.f, 1.f); glVertex3f(sizeX / 2.f, sizeY / -2.f, sizeZ / 2.f); glTexCoord2f(0.f, 0.f); glVertex3f(sizeX / 2.f, sizeY / 2.f, sizeZ / 2.f); glTexCoord2f(1.f, 0.f); glVertex3f(sizeX / -2.f, sizeY / 2.f, sizeZ / 2.f); glTexCoord2f(1.f, 1.f); glVertex3f(sizeX / -2.f, -sizeY / 2.f, sizeZ / 2.f); glNormal3f(0.f, 0.f, -1.f); glColor3d(m_color.getRed(), m_color.getGreen(), m_color.getBlue()); glTexCoord2f(0.f, 1.f); glVertex3f(sizeX / 2.f, sizeY / 2.f, sizeZ / -2.f); glTexCoord2f(0.f, 0.f); glVertex3f(sizeX / 2.f, sizeY / -2.f, sizeZ / -2.f); glTexCoord2f(1.f, 0.f); glVertex3f(sizeX / -2.f, sizeY / -2.f, sizeZ / -2.f); glTexCoord2f(1.f, 1.f); glVertex3f(sizeX / -2.f, sizeY / 2.f, sizeZ / -2.f); glDisable(GL_TEXTURE_2D); GLenum e; if ((e = glGetError()) != GL_NO_ERROR){ std::string s = "error: " + Utility::toString<int>(e); //HandleSDL::displayErrorMessage("error opengl", s.c_str()); s = Utility::toString<int>(GL_INVALID_OPERATION); HandleSDL::displayErrorMessage("if", s.c_str()); } } else { glBegin(GL_QUADS); glNormal3f(-1.f, 0.f, 0.f); glColor3d(m_color.getRed(), m_color.getGreen(), m_color.getBlue()); glVertex3f(sizeX / -2.f, sizeY / -2.f, sizeZ / -2.f); glVertex3f(sizeX / -2.f, -sizeY / 2.f, sizeZ / 2.f); glVertex3f(sizeX / -2.f, sizeY / 2.f, sizeZ / 2.f); glVertex3f(sizeX / -2.f, sizeY / 2.f, sizeZ / -2.f); glNormal3f(0.f, 1.f, 0.f); glColor3d(m_color.getRed(), m_color.getGreen(), m_color.getBlue()); glVertex3f(sizeX / -2.f, sizeY / 2.f, sizeZ / -2.f); glVertex3f(sizeX / -2.f, sizeY / 2.f, sizeZ / 2.f); glVertex3f(sizeX / 2.f, sizeY / 2.f, sizeZ / 2.f); glVertex3f(sizeX / 2.f, sizeY / 2.f, sizeZ / -2.f); glNormal3f(1.f, 0.f, 0.f); glColor3d(m_color.getRed(), m_color.getGreen(), m_color.getBlue()); glVertex3f(sizeX / 2.f, sizeY / 2.f, sizeZ / -2.f); glVertex3f(sizeX / 2.f, sizeY / 2.f, sizeZ / 2.f); glVertex3f(sizeX / 2.f, sizeY / -2.f, sizeZ / 2.f); glVertex3f(sizeX / 2.f, sizeY / -2.f, sizeZ / -2.f); glNormal3f(0.f, -1.f, 0.f); glColor3d(m_color.getRed(), m_color.getGreen(), m_color.getBlue()); glVertex3f(sizeX / 2.f, sizeY / -2.f, sizeZ / -2.f); glVertex3f(sizeX / 2.f, sizeY / -2.f, sizeZ / 2.f); glVertex3f(sizeX / -2.f, -sizeY / 2.f, sizeZ / 2.f); glVertex3f(sizeX / -2.f, sizeY / -2.f, sizeZ / -2.f); glNormal3f(0.f, 0.f, 1.f); glColor3d(m_color.getRed(), m_color.getGreen(), m_color.getBlue()); glVertex3f(sizeX / 2.f, sizeY / -2.f, sizeZ / 2.f); glVertex3f(sizeX / 2.f, sizeY / 2.f, sizeZ / 2.f); glVertex3f(sizeX / -2.f, sizeY / 2.f, sizeZ / 2.f); glVertex3f(sizeX / -2.f, -sizeY / 2.f, sizeZ / 2.f); glNormal3f(0.f, 0.f, -1.f); glColor3d(m_color.getRed(), m_color.getGreen(), m_color.getBlue()); glVertex3f(sizeX / 2.f, sizeY / 2.f, sizeZ / -2.f); glVertex3f(sizeX / 2.f, sizeY / -2.f, sizeZ / -2.f); glVertex3f(sizeX / -2.f, sizeY / -2.f, sizeZ / -2.f); glVertex3f(sizeX / -2.f, sizeY / 2.f, sizeZ / -2.f); GLenum e; if ((e = glGetError()) != GL_NO_ERROR){ std::string s = "error: " + Utility::toString<int>(e); //HandleSDL::displayErrorMessage("error opengl", s.c_str()); s = Utility::toString<int>(GL_INVALID_OPERATION); HandleSDL::displayErrorMessage("else", s.c_str()); } } GLenum e1; if ((e1 = glGetError()) != GL_NO_ERROR){ std::string s = "error: " + Utility::toString<int>(e1); //HandleSDL::displayErrorMessage("error opengl", s.c_str()); s = Utility::toString<int>(GL_INVALID_OPERATION); HandleSDL::displayErrorMessage("other other", s.c_str()); } glEnd(); GLenum e; if ((e = glGetError()) != GL_NO_ERROR){ std::string s = "error: " + Utility::toString<int>(e); //HandleSDL::displayErrorMessage("error opengl", s.c_str()); s = Utility::toString<int>(GL_INVALID_OPERATION); HandleSDL::displayErrorMessage("other", s.c_str()); }
titre : "IN" / texte : "lol"
titre : "OTHER" / texte : 1282 (qui est la valeur de l'erreur, c'est-a-dire GL_INVALID_OPERATION)
Donc je vous avoue etre a court d'idee. Pourquoi le fait d'appeler gluLookAt au bon endroit dans mon application fait-il tout planter ? C'est a s'en arracher les cheveux...
Merci d'avance pour l'aide que vous m'apporterez !