=________=
comme quoi, des fois il ne faut pas chercher spécialement compliqué ...
Version imprimable
=________=
comme quoi, des fois il ne faut pas chercher spécialement compliqué ...
bonjour
Je me permet de faire remonter ce sujet que j'ai initié il y a quelques temps, car mon problème n'est pas résolu. J'avais mis ce problème de côté et vacances de retour donc je m'y remet. J'ai pas mal regardé tout ce qui à été dis sur le forum mais tout ce que j'arrive à avoir en visuel sur ma scène c'est :
http://www.noelshack.com/uploads/fbo077739.JPG
si quelqu'un à une idée d'où peut provenir ce genre d'erreur. Si nécessaire je posterai mon code... on sais jamais
tu peux dire de quelle erreur tu parles par rapport à ta capture ?
tu cherches toujours à utiliser l'extension FBO ou ça fonctionne de ce côté là ?
pour ceux que ça intéresse de gérer les extensions opengl sans se prendre la tête il y a des bibliothèques très bien faites comme glew ou glee
après si vous voulez réinventer la roue c'est votre problème :aie:
tout l'interet dans mon cas et de le refaire par moi même en utilisant les shaders. Il sembleai que mon fbo soit bien construit, me pose problème, juste son utilisation qui semble ne se faire que sur un petit morceau de mon image.
je met on code fait sous visual c++ si vous arrivé à cerner une erreur de synthaxe ou autre.
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294 #include "stdafx.h" //Initialisation de la fenêtre const GLushort LARGEUR_FENETRE=512; const GLushort HAUTEUR_FENETRE=512; const GLubyte POS_X_ECRAN=200; const GLubyte POS_Y_ECRAN=100; void redimensionnement(int w,int h); void aide_touches(); void infos(); void clavier(unsigned char key,int x,int y); void special(int touche,int x,int y); void souris(int bouton, int state,int x,int y); void oisif(); void affichage(); void axes(); //camera GLdouble camx,camy,camz; // Identifiants GLuint framebuffer, depthbuffer; // Shaders GLuint vertexShaderID0; GLuint fragmentShaderID0; GLuint programID0; GLint location; GLint locCentre; bool change; void Init_light() { //différents paramètres GLfloat ambient[] = {0.15f,0.15f,0.15f,1.0f}; GLfloat diffuse[] = {0.15f,0.15f,0.15f,1.0f}; GLfloat light0_position [] = {-25.0f, 10.0f, 0.0f, 0.0f}; GLfloat specular_reflexion[] = {0.2f,0.2f,0.2f,1.0f}; //GLfloat direction[]={0,1,0}; GLubyte shiny_obj = 128; //positionnement de la lumière avec les différents paramètres glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0,GL_AMBIENT,ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse); glLightfv(GL_LIGHT0,GL_POSITION,light0_position); //glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,direction); glEnable(GL_LIGHT0); //spécification de la réflexion sur les matériaux glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular_reflexion); glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,shiny_obj); } main(int argc,char ** argv) { camx=20;camy=10;camz=20; glutInit(&argc,argv); glutInitWindowPosition(POS_X_ECRAN,POS_Y_ECRAN); glutInitWindowSize(LARGEUR_FENETRE,HAUTEUR_FENETRE); glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH); glutCreateWindow("Projet vide"); glEnable(GL_LINE_SMOOTH); glEnable(GL_DEPTH_TEST); Init_light(); glutDisplayFunc(affichage); glutReshapeFunc(redimensionnement); glutKeyboardFunc(clavier); glutSpecialFunc(special); glutMouseFunc(souris); glewInit(); if (glewIsSupported("GL_VERSION_2_0")) printf("Ready for OpenGL 2.0\n"); else { printf("OpenGL 2.0 not supported\n"); exit(1); } // verify FBOs are supported (otherwise we get FuBar'd Objects) if (!glutExtensionSupported ("GL_EXT_framebuffer_object") ) { cerr << "FBO extension unsupported" << endl; exit (1); } glGenTextures(1, &depthbuffer); glBindTexture(GL_TEXTURE_2D, depthbuffer); //glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 512, 512, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, 1024, 1024, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glGenFramebuffersEXT(1, &framebuffer); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, depthbuffer, 0); //glDrawBuffer(GL_NONE); //glReadBuffer(GL_NONE); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); setShaders(); glutMainLoop(); return 0; } void aide_touches() { fprintf(stderr,"\n\nAIDE CLAVIER"); } void infos() { fprintf(stderr,"\n\nINFORMATIONS (angles) "); } void clavier(unsigned char key,int x,int y) { switch(key) { case 27: exit(0); } glutPostRedisplay(); } void special(int touche,int x,int y) { fprintf(stderr,"\nTouche non geree"); redimensionnement(LARGEUR_FENETRE,HAUTEUR_FENETRE); glutPostRedisplay(); } //////////////////////////////////////////////////////////////////////////////////////////////////////////// void souris(int bouton, int state,int x,int y) { glutPostRedisplay(); } void redimensionnement(int w,int h) { if(w<h) glViewport(0,(GLsizei) (w - h)/2, (GLsizei) w,(GLsizei) w); else glViewport(0,(GLsizei) (w - h)/2, (GLsizei) h,(GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45,1,0.0012,500); glMatrixMode(GL_MODELVIEW); affichage(); } void RenderScene() { glPushMatrix(); glColor3f(0.9,0.3,0.1); glTranslatef(0,3,0); glutSolidTeapot(5); glPopMatrix(); glColor3f(0.8,0.2,0.4); glPushMatrix(); glScalef(30,1,30); glutSolidCube(1); glPopMatrix(); } void DrawQuad () { // On utilise une perception 2D glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); gluOrtho2D (0.0, 512.0, 0.0, 512.0); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glColor3f (1.0f, 1.0f, 1.0f); glBegin (GL_QUADS); glTexCoord2f (0.0f, 0.0f); glVertex2f (0.0f, 0.0f); glTexCoord2f (1.0f, 0.0f); glVertex2f (512.0f, 0.0f); glTexCoord2f (1.0f, 1.0f); glVertex2f (512.0f, 512.0f); glTexCoord2f (0.0f, 1.0f); glVertex2f (0.0f, 512.0f); glEnd (); glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); } void affichage() { glClearColor(1.0,1.0,1.0,0.0); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glUseProgram(0); // On rend la scène dans le framebuffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gluLookAt(-25.0f, 10.0f, 0.0f, 0.0,0.0,0.0, 0.0,1.0,0.0); glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, framebuffer); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); RenderScene(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Puis on dessine la texture glEnable (GL_TEXTURE_2D); glBindTexture (GL_TEXTURE_2D, depthbuffer); DrawQuad (); glBindTexture (GL_TEXTURE_2D, 0); glDisable (GL_TEXTURE_2D); glUseProgram(programID0); /* glLoadIdentity(); gluLookAt(camx,camy,camz, 0.0,0.0,0.0, 0.0,1.0,0.0); RenderScene(); */ glutSwapBuffers(); }
fichier .frag
fichier .vertCode:
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 varying vec3 lightDir,normal,vectVue; uniform sampler2DShadow shadow_map; varying vec4 proj_shadow; void main() { vec4 color; vec3 N=normalize(normal); vec3 L=normalize(lightDir); vec3 V=normalize(vectVue); vec3 R = reflect(-L, N); float lambertTerm = max( dot(N,L), 0.0); if(lambertTerm > 0.0) { color = gl_Color *lambertTerm * shadow2DProj(shadow_map, proj_shadow); vec3 R = reflect(-L, N); float specular = pow( max(dot(R, V), 0.0),15 ); color +=specular ; } gl_FragColor = color ; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 varying vec3 lightDir,normal,vectVue; varying vec4 proj_shadow; void main() { // coordonnées de la direction de la lumière données dans le repère de la caméra lightDir=vec3(gl_LightSource[0].position)-vec3(gl_ModelViewMatrix*gl_Vertex); // passage des coordonées de la normale du repère de la scène vers de repère de la caméra normal=gl_NormalMatrix*gl_Normal; // coordonées du vecteur VertexCamera dans le repère de la caméra vectVue=-vec3(gl_ModelViewMatrix*gl_Vertex); gl_Position=ftransform(); proj_shadow = gl_TextureMatrix[0] * gl_TextureMatrixInverse[1] * gl_ModelViewMatrix * gl_Vertex; gl_FrontColor = gl_Color; }
bon, après avoir bien décortiquer mon code il semblerai que le problème vienne deja de la création du fbo... une idée?
Il faut que tu décommentes glDrawBuffer et glReadBuffer. Sinon, peux-tu ajouter ces lignes avant de débinder ton framebuffer :Citation:
glGenFramebuffersEXT(1, &framebuffer);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, depthbuffer, 0);
//glDrawBuffer(GL_NONE);
//glReadBuffer(GL_NONE);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
GLenum status = glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT);
if (status == GL_FRAMEBUFFER_COMPLETE_EXT)
std::cerr << "Le problème ne vient pas du framebuffer" << std::endl;
merci pour ta réponse. J'ai suivi tes instructions, le problème ne vient pas du framebuffer et la texture que j'obtiens est un joli gris uniforme.
quand je veux l'appliquer sur ma scene je réobtient le screen que j'ai posté plus haut... une idée?
si ça peut faire avancer le schmilblick, je mets le code que j'ai utilisé pour faire la depth pour mon shadow mapping, les nons des fonctions openGL ne sont peut être pas exactes car dans mon code j'utilise une classe pour gérer les extensions
à l'initialisation:
dans le render:Code:
1
2
3
4
5
6
7
8
9
10 GenFramebuffer(1,&frameBufferID); GenRenderbuffer(1,&renderBufferID); BindFramebuffer(GL_FRAMEBUFFER,frameBufferID ); BindRenderbuffer(GL_RENDERBUFFER,renderBufferID ); RenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT,tX,tY); FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderBufferID); FramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, textureT, textureID); glDrawBuffer(GL_NONE); glReadBuffer(GL_NONE);
ici le rendu avec:Code:
1
2
3 BindFramebuffer(GL_FRAMEBUFFER, frameBufferID); BindRenderbuffer(GL_RENDERBUFFER,renderBufferID );
effacement des buffer,
gluLookAt,
gluPerspective ...
Ce code ne permet pas de récupéré l'image de profondeur. Au départ dans mes essais avec les pBuffer il fallait que la camera sois tres pres pour récupéré une image sinon tout est blanc ou noir.Code:
1
2
3 BindFramebuffer(GL_FRAMEBUFFER, 0); BindRenderbuffer(GL_RENDERBUFFER,0 );
l'idée reste la même mais ce n'et pas plus concluant...:cry:
chez moi ça marche implacable
il faut aussi que la texture soit créé avec ça
Et sa aussi, bien qu'on puisse le mettre après le glBinTexture:Code:
1
2 glTexImage2D( GL_TEXTURE2D, 0, GL_DEPTH_COMPONENT24, tX, tY, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0 );
Rastacouéne, c'est quoi ton problème exacte?Code:
1
2
3 glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
mon problème est le suivant:
je cherche a afficher la texture créer a partir des valeurs de profondeur afin de l'utiliser dans mes shaders pour afficher les ombres portées sur les objets de ma scene.
C'est normal que tout soit "blanc" ou "noir". Si tu es un peu trop loin de ton modèle le zbuffer donne des valeurs entre 0.9 et 1.0 donc il n'y a presque pas de différence si tu l'affiches directement.
Pour être sûr que tu reçois bien le zbuffer affiche le zmin et le zmax. Normalement tu devrais avoir [x;1.0] avec x compris entre 0 et 1. Si tu as [1.0,1.0] ou [0.,0.] alors là où tu ne reçois pas le zbuffer.
et si j'obtiens un joli gris uniforme ça corresponds à quoi?^^
tu essaies de faire un rendu de ta scène uniquement sur le zbuffer pour ensuite le récupérer et t'en servir pour calculer les ombres
si tu récupères une surface grise, c'est peut-etre parceque le frustum du rendu à partir de la source lumineuse est mal défini
tu devrais effectuer un rendu de ta scène depuis ta lumière dans le frame buffer afin de voir ce que tu essaies de rendre dans ton zbuffer
ce sera plus parlant
c'est pourtant ce que je fais:
je me place a la position de ma lumiére et je fais un rendu dans le frame bufferCode:
1
2
3
4
5
6
7 gluLookAt(-25.0f, 10.0f, 0.0f, 0.0,0.0,0.0, 0.0,1.0,0.0); glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, framebuffer); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); RenderScene(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
Avec mon code il n'y pas d'écriture dans un fbo color, donc pas d'image crée car j'ai ça.
sinon mon fbo n'est pas valide.Code:
1
2 glDrawBuffer(GL_NONE); glReadBuffer(GL_NONE);
Ça ne m'empêche pas de faire du shadow mapping.
Pour l'instant mon shadow mapping est sans shader comme ici http://www.paulsprojects.net/opengl/...shadowmap.html
j'ai suivie ce tuto
J'ai l'intention de faire du shadow mapping avec shader GLSL. Je voudrai bien savoir si les deux cas sons différents. Je vais suivre ce topic
et donc, comme je demandais, si tu regardes le rendu dans le color buffer plutot que dans le depth buffer ce sera plus parlant afin de savoir si le rendu que tu fais est valide ou si tu as un problème de positionnement de caméra
j'espère que je me fait comprendre :aie:
en désactivant le rendu dans depth buffer, et donc rendu normal, ma scene se rend bien sans probleme, bien orienté vers ma scene tout comme ma lumiere
j'ai réussi a avoir une texture comportant les données du tampon de profondeur mais grace à glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, 0, 0, 512, 512, 0);
donc je suis pas encore dans le fbo et j'ai du mal a appliquer ça a mon shader, qulqu'un peux m'aider?
les différents rendu que j'arrive pour l'instat a obtenir sont les suivant: ( avec en cadeau mon image de depth buffer du pts de vue de la lumière^^)
http://www.noelshack.com/uploads/rendu013594.JPG
Peux tu mettre le code de ton shader?