2009-12-19 6 views
1

En raison de problèmes de performances, j'ai dû transférer mon code android opengl de Java vers C. Je crois que j'ai transféré tout le code OpenGL, mais j'ai maintenant beaucoup d'erreurs avec la section de mon code qui dessine un bitmap en tant que texture à l'écran. Lorsque j'exécute le projet dans un émulateur, le code actuel n'affiche rien et semble avoir une fuite de mémoire car il prend lentement toute la mémoire et oblige les autres applications à se fermer.Problèmes de dessin OpenGL ES dans Android NDK

Voici le code qui contrôle cette partie:

Dans le fichier d'en-tête:

extern unsigned char colors[1024*512*3]; // 3 bytes per pixel 

Dans le fichier c:

void appRender(int width, int height, unsigned char colors) 
{ 
    unsigned int textureID; 
    float vertices[] = 
    { 
     0.0f, 0.0f, 
     512.0f, 0.0f, 
     0.0f, 1024.0f, 
     512.0f, 1024.0f 
    }; 

    float texture[] = 
    { 
     0.0f, 0.0f, 
     1.0f, 0.0f, 
     0.0f, 1.0f, 
     1.0f, 1.0f 
    }; 

    unsigned char indices[] = 
    { 
     0, 1, 3, 
     0, 3, 2 
    }; 

    UpdateView(); 


    //onDraw 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glOrthof(0.0f, 320.0f, 430.0f, 0.0f, 1.0f, -1.0f); 

    //texture stuff 
    glGenTextures(1,&textureID); 
    glBindTexture(GL_TEXTURE_2D, textureID); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    //Different possible texture parameters, e.g 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 1024, 0, GL_RGB ,GL_UNSIGNED_BYTE, colors); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glVertexPointer(2, GL_FLOAT, 0, vertices); 
    glTexCoordPointer(2, GL_FLOAT, 0, texture); 

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
} 

Toute aide serait grandement appréciée.

+0

Je t'aime tellement en ce moment :) - déchire mes cheveux en essayant d'obtenir quelque chose à l'écran pendant plus de 2 heures - MERCI DE EXEMPLE! – torger

+0

@torger ce code n'affiche rien, il est cassé d'une manière ou d'une autre. J'ai oublié comment je l'ai réparé, vous pouvez jeter un oeil à la page de code google pour "thelements" cependant, nous faisons un dessin assez simple là-bas. – RyanCheu

+0

Je l'ai fait travailler haha ​​- Je ne sais pas comment je l'ai fait :) - dois dire - il n'y a pas de meilleur sentiment que de voir ce carré blanc pour la première fois – torger

Répondre

3

Il ne semble pas y avoir d'appel au glEnable(GL_TEXTURE_2D) pour activer la texturation dans votre exemple.

Vous pouvez appeler glGetError() pour savoir si ce que vous faites est incorrect. Cela m'a aidé à déboguer des problèmes dans le passé.

Vous semblez également créer votre texture dans votre méthode appRender(). Si cela est appelé pour chaque image que vous dessinez, cela pourrait être la cause de votre fuite de mémoire car vous recréerez à plusieurs reprises la même texture.

Généralement, vous ne devez générer et définir la texture qu'une seule fois pendant l'initialisation.

Donc ce qui suit devrait être fait une fois avant le rendu.

glGenTextures(1,&textureID); 
glBindTexture(GL_TEXTURE_2D, textureID); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

//Different possible texture parameters, e.g 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 1024, 0, GL_RGB ,GL_UNSIGNED_BYTE, colors); 

Puis, quand le dessin que vous pouvez faire

glEnable(GL_TEXTURE_2D) 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glBindTexture(GL_TEXTURE_2D, textureID); 

glVertexPointer(2, GL_FLOAT, 0, vertices); 
glTexCoordPointer(2, GL_FLOAT, 0, texture); 

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisable(GL_TEXTURE_2D) 
+0

J'ai essayé cela, et il s'est débarrassé de ma fuite de mémoire , mais je ne peux toujours rien tirer. Rien n'apparaît à l'écran. – RyanCheu

+0

Edit: Je pouvais voir des choses à chaque fois que j'ai lancé l'initialisation. On dirait qu'il me manque quelque chose dans la première partie de la deuxième partie? – RyanCheu