Bonjour,

J'ai un probleme assez troublant avec opengl es sous android.
Je programme un petit jeu (genre lemmings) et ai besoin de modifier des textures.
mon rendering s'effectue en 2 parties:

1..Je modifie les textures (si besoin)
2..J'affiche les objets.


Jusqu'ici , sans modifications de textures,tout fonctionne a peu près comme il faut.Pour l'affichage,j'utilise l'extension DrawTexture.Pour la modification de texture, j'utilise le blending,des FBOs et toujours la fonction DrawTexture.

Mon probleme:
Les modifications de textures ne sont pas prises en compte.
Quand j'execute le programme, les textures ne sont pas modifiée.Je me suis bien dis que ma fonction etait buggée,mais quand je debugue la fonction en pas a pas, la modification de la texture se fait bien comme il faut.
Etrange comme comportement...Des opérations qui ne se font pas en execution normale et qui ne posent pas de problemes en debug pas à pas!!

J'ai essayé de simplifier la modification en diminuant le nombre d'opérations,et j'obtiens toujours un comportement erratique .
Pour le coup je suis completement bloqué.
J'ai effectué un log des appels de fonctions (des fois que ma fonction de modification ne soit pas appelée) mais tout se passe bien.
J'ai essayé de lire les erreurs opengl, mais la encore,rien a declarer(a moins que je teste a chaque ligne...je vais essayer).
Les FBO sont bien crées et actifs.Les textures sont bien chargées.
J'ai essayé un glFlush/glFinish en fin de fonction,sans succès.

Voici le code de ma fonction.

J'utilise une texture(tempbuf et temptex) comme buffer temporaire.


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
 
public void DigTexture(GL10 gl)
{
	GL11ExtensionPack gl2 = (GL11ExtensionPack) gl;
	int srcbuf = TextureManager.GetTexFBufferId(srctexid);
	int modtex = TextureManager.GetGLTexId(modtexid);
	int srctex = TextureManager.GetGLTexId(srctexid);
	int tempbuf = TextureManager.GetTempTexFbufferID();
	int temptex = TextureManager.GetTempGLTexID();
	int tempcrop[] = { 0, 0, 0, 0 };
 
 
	// modify textures
	if (srcbuf != -1)
	{
		gl.glEnable(GL10.GL_BLEND);
		gl.glDisable(GL10.GL_ALPHA_TEST);
		// Bind temp fbuffer	
		gl2.glBindFramebufferOES(GLES11ext.GL_FRAMEBUFFER_OES, tempbuf);
		// Bind modifier texture
		gl.glBindTexture(GL10.GL_TEXTURE_2D, modtex);
		// set Alpha Test and Blendfunc   (just overwrite the whole area)
		gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ZERO);
		// draw modifier
		tempcrop[2] = modcrop[2];
		tempcrop[3] = modcrop[3];
		GLES11.glTexParameteriv(GL10.GL_TEXTURE_2D, GLES11Ext.GL_TEXTURE_CROP_RECT_OES, modcrop, 0);
		GLES11Ext.glDrawTexiOES(tempcrop[0], tempcrop[1], 0, tempcrop[2], tempcrop[3]);
		// set Alpha test and Blendfunc (
		gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
		gl.glAlphaFunc(GL10.GL_GEQUAL, 1.0f);
		gl.glEnable(GL10.GL_ALPHA_TEST);
		// bind texture to modify
		gl.glBindTexture(GL10.GL_TEXTURE_2D, srctex);
		// draw texture to modify
		GLES11.glTexParameteriv(GL10.GL_TEXTURE_2D, GLES11ext.GL_TEXTURE_CROP_RECT_OES, srccrop, 0);			
		GLES11Ext.glDrawTexiOES(tempcrop[0], tempcrop[1], 0, tempcrop[2], tempcrop[3]);
		// bind texture to change buffer
		gl2.glBindFramebufferOES(GLES11Ext.GL_FRAMEBUFFER_OES, srcbuf);
		// bind modified temp texture
		gl.glBindTexture(GL10.GL_TEXTURE_2D, temptex);
		// set Alpha test and Blendfunc
		gl.glBlendFunc(GL10.GL_ZERO, GL10.GL_SRC_ALPHA);			gl.glDisable(GL10.GL_ALPHA_TEST);
		// write to main texture the modification 
		GLES11.glTexParameteriv(GL10.GL_TEXTURE_2D, GLES11ext.GL_TEXTURE_CROP_RECT_OES, tempcrop, 0);		
		GLES11Ext.glDrawTexiOES(srccrop[0], srccrop[1], 0, srccrop[2], srccrop[3]);
		// restore screen framebuffer
		gl2.glBindFramebufferOES(GLES11Ext.GL_FRAMEBUFFER_OES, 0);
		// restore active texture
		gl.glBindTexture(GL10.GL_TEXTURE_2D, G.activetexid);
	}
}


Quelqu'un a une idée ou une experience similaire?