Bonjour,

dans le cadre de la création d'ombres en 2D avec des sources de lumières multiples, j'ai décidé d'utiliser un texture array 2d pour y stocker toutes les textures d'ombres de chacune de mes sources.
Mes FBO, eux, vont s'occuper de dessiner dans ces textures.

J'ai passé pas mal de temps à revoir le code, mais impossible de mettre la main sur l'élément ou les éléments qui posent problème dans mon code, sachant que gDEBugger m'indique des GL_INVALID_FRAMEBUFFER_OPERATION à chaque action effectuée pendant le rendu des FBO sur mes textures.

Je crée un FBO comme ceci :
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
bool FrameBuffer::load(ng::TextureArray textureArray, int textureId)
{
	// Removal of the last frame buffer
	glDeleteFramebuffers(1, &m_id);
	glDeleteRenderbuffers(1, &m_depthBufferId);
	glDeleteTextures(1, &m_textureId);
 
 
	// Initialization of the frame buffer
	glGenFramebuffers(1, &m_id);
	glBindFramebuffer(GL_FRAMEBUFFER, m_id);
 
 
	/// Initialization of the depth buffer
	glGenRenderbuffers(1, &m_depthBufferId);
	glBindRenderbuffer(GL_RENDERBUFFER, m_depthBufferId);
	glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, textureArray.getSize().x, textureArray.getSize().y);
	glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthBufferId);
	glBindRenderbuffer(GL_RENDERBUFFER, 0);
 
 
	// Initialization of the render buffer
	glBindTexture(GL_TEXTURE_2D_ARRAY, textureArray.getId());
 
	glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureArray.getId(), 0, textureId);
	GLenum buffersToDraw[1] = {GL_COLOR_ATTACHMENT0};
	glDrawBuffers(1, buffersToDraw);
 
	glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
	glBindFramebuffer(GL_FRAMEBUFFER, 0);
 
	if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
	{
		glDeleteFramebuffers(1, &m_id);
		glDeleteRenderbuffers(1, &m_depthBufferId);
 
		ng::logs.saveDebugMessage("ERROR", FUNC_NAME, "Frame buffer initialization failed.");
		return false;
	}
 
	m_size = textureArray.getSize();
	return true;
}
J'initialise mon array de textures comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
std::vector<GLubyte> texels(textureSize.x * textureSize.y * textureCount, 0);
 
glGenTextures(1, &m_id);
glBindTexture(GL_TEXTURE_2D_ARRAY, m_id);
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_R8, textureSize.x, textureSize.y, textureCount);
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, textureSize.x, textureSize.y, textureCount, GL_RED, GL_UNSIGNED_BYTE, &texels[0]);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D_ARRAY, 0);

L'utilisation de tout ça lors du rendu est effectuée comme avec un FBO et une texture "simple".
Je bind le FBO de la nième texture, je fais le rendu, et je l'unbind ensuite.
Et pour l'utilisation de la texture (même si pour le moment je pense pas que le problème vienne de là), je bind/unbind l'array texture comme si c'était une simple texture (en oubliant pas d'utiliser un sampler2DArray dans mon shader) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D_ARRAY, textureArrayId);
glUniform1i(glGetUniformLocation(shader.getId(), "texture0"), 0);
 
// rendu dans la fenetre
 
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D_ARRAY, 0);

Si les GL_INVALID_FRAMEBUFFER_OPERATION se produisent, c'est sans doute qu'il y a eu un problème soit lors de la création de l'array texture (mais normalement il est bien créé, il est bien présent dans le viewer de gDEGugger), soit lors de la création du framebuffer.
Mais en comparant mon code à une tripotée d'autres sur le net, je ne trouve toujours pas ce qui cloche.



Je vous remercie d'avance pour toute piste que vous pourriez m'apporter.



PS : j'ai testé sur deux marques de cartes graphiques différentes (Nvidia et AMD), le problème reste le même. Les deux PC sont sous Windows 10.