Bonjour !
Tout d'abord : Merci pour ce forum et vos réponses, je me suis déjà sorti de pas mal de problèmes grâce à vous.
Mais, il en reste xD
Pour résumer un peu, je code actuellement des shaders d'ombrage pour du rendu real-time, mais j'ai besoin des infos sur les pixels voisins donc je voudrais récupérer ces données avec un rendu offscreen via un FBO.
J'ai suivi plusieurs exemples/tutos dispos sur le net, et je ne vois pas où ça cloche sachant que mes deux tests sur le FBO (voir code) me donnent
"Error : Aucune erreur" et
"Unknown error while attempting to create frame buffer object!"
donc je sais pas trop...
voici mes diverses fonctions :
Rendu propre au Mesh :
Création des textures et du FBO
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 void MeshObj::draw_model(bool nor,bool tex) { glEnableClientState(GL_VERTEX_ARRAY); if(nor) glEnableClientState(GL_NORMAL_ARRAY); if(tex) { glEnableClientState(GL_TEXTURE_COORD_ARRAY); glBindTexture(GL_TEXTURE_2D,texture); } glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3,GL_FLOAT,0,vertice); if(tex) glTexCoordPointer(2,GL_FLOAT,0,textures); if(nor) glNormalPointer(GL_FLOAT,0,normals); glColorPointer(4,GL_FLOAT,0,colours); glDrawArrays(GL_QUADS,0,n_data); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 unsigned int W_fen = 1024; // largeur fenetre unsigned int H_fen = 1024; // hauteur fenetre GLuint createRectTex(){ //GLuint type = GL_TEXTURE_RECTANGLE_ARB; GLuint type = GL_TEXTURE_2D; GLuint tex_handle; glGenTextures (1, &tex_handle); glBindTexture(type,tex_handle); // set texture parameters glTexParameteri(type, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(type, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(type, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(type,0,GL_RGBA8,W_fen,H_fen,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL); glBindTexture(type,0); return tex_handle; } void initFBO(){ //create FBO glGenFramebuffersEXT(1,&pp_FBOPreProc); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, pp_FBOPreProc); //Create & init DepthBuffer glGenRenderbuffersEXT(1, &buff_depth); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, buff_depth); glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, W_fen, H_fen); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, buff_depth); //Create & link textures t_position = createRectTex(); t_normal = createRectTex(); t_col = createRectTex(); //GLuint type = GL_TEXTURE_RECTANGLE_ARB; GLuint type = GL_TEXTURE_2D; glBindTexture(type,t_col); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,type, t_col, 0); glBindTexture(type,t_position); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,type, t_position, 0); glBindTexture(type,t_normal); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT2_EXT,type, t_normal, 0); GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); fprintf(stderr, "Error: %s\n", gluErrorString(status)); switch(status) { case GL_FRAMEBUFFER_COMPLETE: return; break; case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: cout<<"An attachment could not be bound to frame buffer object!"<<endl; break; case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: cout<<"Attachments are missing! At least one image (texture) must be bound to the frame buffer object!"<<endl; break; case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: cout<<"The dimensions of the buffers attached to the currently used frame buffer object do not match!"<<endl; break; case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT: cout<<"The formats of the currently used frame buffer object are not supported or do not fit together!"<<endl; break; case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: cout<<"A Draw buffer is incomplete or undefinied. All draw buffers must specify attachment points that have images attached."<<endl; break; case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: cout<<"A Read buffer is incomplete or undefinied. All read buffers must specify attachment points that have images attached."<<endl; break; case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: cout<<"All images must have the same number of multisample samples."<<endl; break; case GL_FRAMEBUFFER_UNSUPPORTED: cout<<"Attempt to use an unsupported format combinaton!"<<endl; break; default: cout<<"Unknown error while attempting to create frame buffer object!"<<endl; break; } //Unload preproc buffers glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glBindTexture(type,0); }
Shaders :
(La Color me permet de faire passer des données, ici "l'aire" de sommet (1/3 de l'aire des faces adjacentes)
Et enfin ma fonction d'affichage :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 Vert : varying vec4 v_position; varying vec3 v_normal; varying float v_area; void main(){ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; gl_FrontColor = gl_Color; v_position = gl_Vertex; v_normal = gl_Normal; v_area = gl_Color.r; } Frag : varying vec4 v_position; varying vec3 v_normal; varying float v_area; void main(void) { gl_FragData[0] = vec4(gl_Color.r, gl_Color.g,gl_Color.b,1.0); gl_FragData[1] = v_position; gl_FragData[2] = vec4(v_normal,v_area); }
Qui devrait me rendre un carré avec ma texture contenant mon rendu offscreen, mais qui me dessine mon mesh normal plus un carré blanc...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 void dessiner( ) { glBindTexture(GL_TEXTURE_2D, 0); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, pp_FBOPreProc); glViewport(0,0,W_fen, H_fen); GLenum dbuffers[] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT}; glDrawBuffers(3, dbuffers); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); GLuint AOV,AOP,AOF; //Load the pre-processing shaders AOV = LoadShader(GL_VERTEX_SHADER,"RtoT.vert"); AOF = LoadShader(GL_FRAGMENT_SHADER,"RtoT.frag"); AOP = LoadProgram(AOV,AOF); glUseProgram(AOP); MyMesh.draw_model(true, false); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glUseProgram(0); glDeleteShader(AOV); glDeleteShader(AOF); glDeleteProgram(AOP); glBindTexture(GL_TEXTURE_2D, t_col); glBegin(GL_QUADS); glTexCoord2d(0.f,1.f); glVertex3d(1.f,1.f,1.f); glTexCoord2d(0.f,0.f); glVertex3d(1.f,1.f,-1.f); glTexCoord2d(1.f,0.f); glVertex3d(-1.f,1.f,-1.f); glTexCoord2d(1.f,1.f); glVertex3d(-1.f,1.f,1.f); glEnd(); glBindTexture(GL_TEXTURE_2D, 0); }
Je vois pas du tout d'où ça pourrait venir...
Il est possible que ce soit une erreur de débutant, j'ai fait pas mal de C++ avant mais je commence seulement le GLSL/opengl.
Infos techniques : XPpro, Nvidia gtx 470, Visual studio 10
Partager