2009-05-21 6 views
2

J'ai pris l'exemple de GLPaint ... J'essaie de mettre un arrière-plan dans le "PaintingView", afin que vous puissiez dessiner sur l'arrière-plan et enfin enregistrer l'image sous forme de fichier ..... Je suis perdu.iPhone: Texture plus grande que 64x64?

Je charger le PNG (512x512) et essayer de « peindre avec elle » au début du programme, mais il est peint comme 64x64 au lieu de 512x512 ...

J'ai essayé avant de charger est comme une sous-vue de la vue de peinture ... mais alors, glReadPixels ne fonctionne pas comme prévu (il prend seulement en considération le PaintingView, pas la sous-vue). Aussi le PaintingView n'a pas une méthode comme initWithImage ... J'ai besoin de glReadPixels travail sur l'image (et dans la modification) mais je ne sais vraiment pas pourquoi quand je le charge, la texture a une taille 64x64 ..

Répondre

0

Tout d'abord, glReadPixels() va seulement voir quel framebuffer est associé à votre contexte OpenGL actuel. Cela pourrait expliquer pourquoi vous n'obtenez pas les pixels que vous attendez. Deuxièmement, que voulez-vous dire par la texture rendue à une taille de pixel spécifique? Je suppose que la texture est rendue en quad, et que la taille de ce quad devrait être sous votre contrôle, en termes de code.

En outre, vérifiez que le chargement de la texture ne génère pas de OpenGL error, je ne suis pas sûr quelles sont les limitations de l'iPhone sur les tailles de texture. Il est tout à fait concevable que 512x512 soit hors de portée. Vous pouvez bien sûr l'étudier vous-même, en appelant le glGetIntegerv() et en utilisant la constante GL_MAX_TEXTURE_SIZE.

2

Le projet exemple GLPaint utilise GL_POINT_SPRITE pour dessiner des copies de la texture de la forme lorsque vous déplacez la forme. Sur l'iPhone, le glPointSize est limité à 64x64 pixels. C'est une limitation matérielle, et dans le simulateur, je pense que vous pouvez le rendre plus grand.

Il semble que vous essayez d'utiliser une méthode GL_POINT_SPRITE pour dessiner votre image d'arrière-plan, et ce n'est vraiment pas ce que vous voulez. Au lieu de cela, essayez de dessiner une boîte plate et texturée qui remplit l'écran.

est ici un peu de code OpenGL qui met en place des sommets et texcoords pour une boîte 2D et dessine ensuite:

const GLfloat verticies[] = { 
     0.0f, 0.0f, 
     1.0f, 0.0f, 
     0.0f, 1.0f, 
     1.0f, 1.0f, 
    }; 

    const GLfloat texcoords[] = { 
     0, 0, 
     1, 0, 
     0, 1, 
     1, 1, 
    }; 

    glVertexPointer(2, GL_FLOAT, 0, verticies); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glTexCoordPointer(2, GL_FLOAT, 0, texcoords); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glEnable(GL_TEXTURE_2D); 

    glBindTexture(GL_TEXTURE_2D, texture); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

Hope qui aide! Notez que vous devez spécifier les sommets différemment en fonction de la configuration de la projection de votre caméra. Dans mon cas, j'ai configuré mon GL_MODELVIEW en utilisant le code ci-dessous - je ne suis pas sûr de savoir comment l'exemple GLPaint le fait.

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glOrtho(0, 1.0, 0, 1.0, -1, 1); 
Questions connexes