10
votes

Android OpenGl-ES Chargement d'une non-puissance de 2 textures

J'ai une application qui j'ai eu une application à plusieurs reprises avec Android, il utilise OpenGL-es.

Je charge actuellement des textures d'un bitmap, comme: P>

//Load up and flip the texture - then dispose the temp
    Bitmap temp = BitmapFactory.decodeResource(Deflecticon.getContext().getResources(), resourceID);
    Bitmap bmp = Bitmap.createBitmap(temp, 0, 0, temp.getWidth(), temp.getHeight(), flip, true);
    temp.recycle();

    //Bind the texture in memory
    gl.glBindTexture(GL10.GL_TEXTURE_2D, id);

    //Set the parameters of the texture.
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

    //On to the GPU
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);


0 commentaires

5 Réponses :


4
votes

Je pense que si vous essayez de créer un bitmap avec la puissance des tailles de 2 axes, puis ajoutez votre bitmap, il devrait fonctionner simplement bien. Peut-être quelque chose comme

Bitmap.createBitmap(notPowerOf2Bitmap, offx, offy, xsize, ysize, bitmapFlag)


8 commentaires

Pas trop, mais nous espérions éventuellement les changer à une date ultérieure et cela facilite le redimensionnement de la résolution! Cette méthode dit qu'il faut un sous-ensemble du nonpotbitmap, cela signifie-t-il que si le sous-ensemble bitmap est inférieur au XSIZE et YSIZE spécifié, il aurait des bords vierges? Ou serait-ce l'étirer? (J'expercerais mais malheureusement pas chez mon PC codant).


Les bitmaps ne doivent pas s'étirer sauf si elles sont jetées à une méthode CreateSaledBitmap. L'espace restant sera vide.


Désolé pour la réponse différée, je suis parti avec d'autres choses, mais je suis arrivé à la mise en œuvre de cela et ne fonctionne pas via cette méthode. Vous ne pouvez pas sous un bitmap dans un bitmap avec une taille plus grande que la source qu'il semble ... je suis maintenant à un peu de perte.


Hmmm ... la seule chose à laquelle je puisse penser, puis de créer un bitmap, d'affecter une toile et de dessiner le bitmap non calé sur la toile, puis utilisez le nouveau bitmap. C'est un peu de ressources lourdes, mais encore une fois c'est la seule autre chose que je peux penser ....


J'ai donné une allée jusqu'à présent, je travaille joliment, ça ne me dérange pas du problème de la ressource, car je fais tout cela au début de l'application. Tout autre chargement / libération sera effectué entre toutes les choses importantes basées sur la vitesse, donc c'est tout bon!


Fantastique! Bonne chance en outre.


Attends, ce qui a fonctionné? La solution écrite ci-dessus ou celle dans le commentaire? La solution écrite a-t-elle été modifiée? Cela a été accepté.


Bitmap.createscaledbatimap (Bitmap Src, Int Dstwidth, Int Dstheight, Filtre booléen) fonctionnent également? Vous devriez être capable de haut de gamme avec cela.



2
votes

Les bitmaps non-Power-de-deux (NPOT) sont pris en charge sur certaines plates-formes de GLEES, mais vous devez vérifier si l'extension appropriée existe. Notez cependant que au moins sur PowerVR SGX, même si le NPOT est soutenu, il existe encore d'autres restrictions assez arbitraires; Par exemple, votre largeur de texture doit être un multiple de 2 (sinon une puissance de 2). En outre, le rendu des NPOT a tendance à être un peu plus lent sur de nombreux GPU.

Une chose que vous pouvez faire est de créer une texture d'emballage qui est une taille de puissance de deux, puis utilisez GLTEXSUMAGIMAGE2D pour télécharger la texture pour ne couvrir qu'une partie de cela, puis régler vos coordonnées de la texture en conséquence. L'inconvénient évident à cet égard est que vous ne pouvez pas utiliser de texture d'emballage dans cette circonstance. Si vous devez absolument prendre en charge l'emballage, vous pouvez simplement accumuler votre texture à la taille de la puissance de deux la plus proche avant d'appeler GltexImage2D, bien que cela introduit généralement des artefacts d'échantillonnage et que les choses floues, surtout si vous essayez de faire du pixel-précis 2D travail.

Une autre chose que vous pourriez envisager, si vous n'avez pas besoin de supporter d'emballage, c'est de faire une "Atlas de texture", dans laquelle vous condensez toutes vos textures dans quelques grandes textures et que votre carte des polygones à juste Portions de Texture Atlas (ES). Vous devez faire attention lorsque vous produisez des mipmaps, mais autres que cela fournit généralement une très belle prestation de performance, ainsi que d'une utilisation plus efficace de la mémoire de la texture, car vous ne gaspillez pas beaucoup d'images rembourrées ou échelles.


2 commentaires

Alors que ma question indique comment faites-vous une texture d'emballage dans Android que vous échantillonnez? Quelle est la meilleure méthode pour faire cela?


Regardez la documentation pour GltexSubImage2D.



0
votes

euh pourquoi ne créez-vous pas deux bitmaps. Chargez le premier comme vous le faites, utilisez CreateBitmapscaled pour transformer ce bitmap en une puissance de deux. Performance-Wise Je ne sais pas si c'est la méthode la plus rapide possible, mais cela fonctionne.


0 commentaires

2
votes

J'ai 2 solutions que j'ai employées pour ce problème. Je peux être plus spécifique si nécessaire, mais conceptuellement, vous pouvez: -

  1. Faites de l'image une puissance de 2 et la section de récolter vous remplissez de canal 100% alpha et chargez les images avec Alpha activé. P> LI>

  2. modifiez votre vecteur / tampon de texture afin qu'il ne charge pas cette section. Donc au lieu d'utiliser la valeur par défaut p> XXX PRE> LI> ol>

    comme la matrice (évidemment, il s'agit de charger une image sur un carré 2 triangé), facteur retour par rapport à la zone à la culture, par exemple. P>

        float texture[] = { 
            0.0f, 0.75f, //
            0.9f, 0.75f, //
            0.0f, 0.0f, //
            0.9f, 0.0f, //
         };
    


0 commentaires

0
votes

Vous pouvez utiliser GLEES20.GLTEXIMAGE2D () pour créer une texture vide avec une largeur et une hauteur spécifiées. Le code exemple est xxx


0 commentaires