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 :
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);
}
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
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)

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);
}
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
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);
 
 
 
}
Qui devrait me rendre un carré avec ma texture contenant mon rendu offscreen, mais qui me dessine mon mesh normal plus un carré blanc...

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