2012-07-11 4 views
1

J'ai trouvé un framework graphique 3D pour Android appelé Rajawali et j'apprends comment l'utiliser. J'ai suivi le tutoriel le plus basique qui rend un objet shpere avec une image jpg de taille 1024x512 pour la texture. Cela a bien fonctionné sur Galaxy Nexus, mais cela n'a pas fonctionné avec le Galaxy Player GB70.Texture OpenGL ES 2.0 ne s'affiche pas sur certains périphériques

Lorsque je dis que cela n'a pas fonctionné, je veux dire que l'objet apparaît mais la texture n'est pas rendue. Finalement, j'ai changé certains paramètres que j'utilise pour le framework Rajawali lors de la création de textures et je l'ai fait fonctionner. Voici ce que j'ai découvert.

La cause venait de l'endroit où le GL_TEXTURE_MIN_FILTER était en cours de définition. Parmi les quatre valeurs suivantes

GLES20.GL_LINEAR_MIPMAP_LINEAR 
GLES20.GL_NEAREST_MIPMAP_NEAREST 
GLES20.GL_LINEAR 
GLES20.GL_NEAREST 

la texture est seulement rendu lorsque GL_TEXTURE_MIN_FILTER n'est pas réglé à un filtre à l'aide mipmap. Donc, quand GL_TEXTURE_MIN_FILTER est réglé sur les deux derniers, cela fonctionne.

Maintenant, voici ce que je ne comprends pas et je suis curieux. Lorsque je réduis l'image que j'utilise comme texture à la taille 512x512 les paramètres GL_TEXTURE_MIN_FILTER n'a pas d'importance. Les quatre paramètres du filtre min fonctionnent. Donc, ma question est, y at-il une exigence pour les dimensions de l'image lors de l'utilisation de filtre min pour la texture? Est-ce que je suis obligé d'utiliser une image qui est carrée? Est-ce que d'autres choses comme le style d'habillage ou la configuration du filtre magnétique peuvent être un problème? Ou est-ce que cela ressemble à un bug de mise en œuvre OpenGL de l'appareil?

Répondre

7

Bonjour, c'est un exemple typique de non-puissance de 2 textures. Les textures doivent avoir une puissance de 2 dans leur résolution pour une multitude de raisons, c'est une erreur très commune et il est arrivé à tout le monde de tomber dans ce piège :) moi aussi. Le fait que la non puissance de 2 textures fonctionne correctement sur certains périphériques/GPU, dépend simplement de l'implémentation des pilotes OpenGL, certains GPU les supportent clairement, d'autres non, je vous suggère fortement d'opter pour les textures pow2 dans afin de pouvoir garantir le fonctionnement sur tous les appareils. Last but not least, l'utilisation de la non-puissance de 2 textures peut vous mener à un scénario cathatrophique dans l'utilisation de la mémoire GPU puisque, la plupart des pilotes qui acceptent les textures non powerof2, doivent redimensionner en mémoire les textures les plus proches. puissance de 2 facteur. Par exemple, avoir une texture de 520X520 pourrait conduire à un mappage de mémoire réel de 1024X1024.

Ceci est quelque chose que vous ne voulez pas parce que dans le monde réel "la taille compte", en particulier sur les appareils mobiles.

Vous pouvez trouver une assez bonne explication dans le livre d'or OpenGL, OpenGL ES 2.0:

En OpenGL ES 2.0, les textures peuvent avoir non-power-of-deux (Npot) dimensions. En d'autres termes, la largeur et la hauteur n'ont pas besoin d'être une puissance de deux. Cependant, OpenGL ES 2.0 a une restriction sur les modes de bouclage qui peuvent être utilisés si les dimensions de la texture ne sont pas la puissance de deux. C'est-à-dire que pour les textures npot, le mode de retour à la ligne ne peut être que GL_CLAMP_TO_EDGE et le filtre de minifica- tion ne peut être que GL_NEAREST ou GL_LINEAR (en d'autres termes, non mappé).L'extension GL_OES_texture_npot assouplit ces restrictions et autorise les modes de retour à la ligne de GL_REPEAT et GL_MIRRORED_REPEAT et permet également aux textures npot de d'être mises en correspondance avec l'ensemble des filtres de minification.

Je vous suggère d'évaluer ce livre car il fait une couverture assez décente à ce sujet.

+0

Merci de proposer une bonne source de matériel d'étude. Mais je suis au courant de la plupart des choses que vous avez mentionnées. Peut-être que je n'ai pas fait mon histoire très claire. –

+1

J'utilise une image de taille 1024 * 512 pour une texture. La texture est bonne sur Galaxy Nexus mais elle n'est pas restituée sur Galaxy Player. La texture ne fonctionnera que sur Galaxy Player dans les deux conditions suivantes. Si vous n'utilisez pas de filtre mipmap pour GL_TEXTURE_MIN_FILTER (linéaire ou plus proche) ou si je redimensionne la taille à 512x512 (alors le paramètre GL_TEXTURE_MIN_FILTER n'a pas d'importance). Et puisque 1024 et 512 sont deux nombres qui sont la puissance de deux, je suppose que le mode de bouclage n'a pas vraiment d'importance. Au moins c'est ce que je pense d'après ce que je comprends. –

+1

Comme ci-dessus j'avais aussi une texture qui avait 2 à la puissance de taille (1024 x 512) et il affichait une texture noire. Le changement dans le mode wrap a fonctionné pour moi. – paj7777