Bonsoir,

Suite au tutoriel présent ici : http://gregouar.developpez.com/tutor...dynamiques-2d/ (Gestion de lumières 2D dynamique), je dois utiliser un frame buffer pour y stocker le résultat des lumières pour enfin avoir un blending additif avec le rendu déjà présent à l'écran.

J'ai donc crée une classe pour cela (avec un rendu de 512*512 pour tester):
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
 
	////////////////////////////////////////////////////////////
	RenderTexture::RenderTexture()
	{
		myTexture = NULL;
	}
 
	////////////////////////////////////////////////////////////
	RenderTexture::~RenderTexture()
	{
		glDeleteFramebuffers(1, &myFramebuffer);		
		delete myTexture;
	}
 
	////////////////////////////////////////////////////////////
	void RenderTexture::create( int width, int height )
	{		
		// Création de la texture
		myTexture = new Texture();
		myTexture->setSize( width, height );
 
		// 1 - Texture
		glBindTexture(GL_TEXTURE_2D, myTexture->getId());
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
 
		// 2 - FBO
		glGenFramebuffers(1, &myFramebuffer);
		glBindFramebuffer(GL_FRAMEBUFFER, myFramebuffer);
 
		// 3 - Attache la texture au FBO
		glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, myTexture->getId(), 0);
 
		// 4 - Une erreur s'est produite ?
		GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ;
		if(status != GL_FRAMEBUFFER_COMPLETE) {
			Log::getInstance()->add(Log::ERROR, "Erreur lors de la création du framebuffer");
		} else {
			Log::getInstance()->add(Log::ERROR, "FrameBuffer : OK");
		}
 
		// 5 - On desactive le FBO
		glBindFramebuffer( GL_FRAMEBUFFER, 0);	
	}	
 
	////////////////////////////////////////////////////////////
	void RenderTexture::start()
	{
		glBindFramebuffer(GL_FRAMEBUFFER, myFramebuffer);
	}
 
	////////////////////////////////////////////////////////////
	void RenderTexture::finish()
	{
		glBindFramebuffer(GL_FRAMEBUFFER, 0);
	}
 
	void RenderTexture::bind()
	{
		glActiveTexture(GL_TEXTURE0);
		glBindTexture( GL_TEXTURE_2D, myTexture->getId() );
	}
Le code ne me retourne aucune erreur, c'est déjà une bonne chose

Voici ensuite le moment pendant lequel je l'utilise :

1 - Affichage de la scène normalement (tout les objets du décors)
-> Draw normal

2 - Affichage des lumières :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
	myFBO.start();
 
	for( std::vector<Light*>::iterator i = myLights.begin(); i < myLights.end(); i++ )
	{
		(*i)->draw();
	}
 
	myFBO.finish();
	myFBO.bind();
3 : Affichage final du frameBuffer original :
glBindFramebuffer(GL_FRAMEBUFFER, myFramebuffer);
glBindRenderbuffer(GL_RENDERBUFFER, myColorbuffer);

Je me retrouve avec la scène normal sans aucune lumières. Si je désactive le fbo.start() et fbo.finish(), j'ai bien mes lumières à l'écran, seulement elles se retrouvent superposées aux éléments (car ça n'utilise pas le FBO). Une idée concernant cette disparition des lumières ?

Merci à vous.
Solaroid.