2015-08-07 1 views
1

Pour un cache de texture OpenGL, j'ai besoin d'initialiser une grande texture (≥ 2048x2048), puis d'en mettre fréquemment à jour de petites sections.Génération et mise à jour d'une texture d'échelle de gris 8 bits dans OpenGL ES 2.0

Le code suivant (pseudo-) fonctionne:

// Setup texture 
int[] buffer = new int[2048*2048/4]; // Generate dummy buffer with 1 byte per pixel 
int id = glGenTexture(); 
glBindTexture(GL_TEXTURE_2D, id); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 2048, 2048, 0, GL_ALPHA, GL_UNSIGNED_BYTE, buffer); 

// Perform update 
glBindTexture(GL_TEXTURE_2D, id); 
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, data); 

Mais je trouve la création totalement inutile d'un tampon int-4Mo un peu indésirable pour dire le moins. Donc, j'ai essayé ce qui suit à la place:

// Setup texture 
int id = glGenTexture(); 
glBindTexture(GL_TEXTURE_2D, id); 
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 0, 0, 2048, 2048, 0); 

Cela m'a donné une erreur de GL_INVALID_OPERATION, que je crois est causé par le fait que le cadre-tampon ne contient pas une valeur alpha, donc plutôt que de mettre juste que 1 , l'appel échoue.

tentative suivante:

// Setup texture 
int id = glGenTexture(); 
glBindTexture(GL_TEXTURE_2D, id); 
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 2048, 2048, 0); 

Cela fonctionne, mais maintenant mon appel glTexSubImage2D échoue avec GL_INVALID_OPERATION car elle spécifie GL_ALPHA au lieu de GL_LUMINANCE. Alors, je l'ai changé cela aussi bien pour obtenir:

// Perform update 
glBindTexture(GL_TEXTURE_2D, id); 
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL_LUMINANCE, GL_UNSIGNED_BYTE, data); 

Et j'ai changé shaders pour lire la valeur de la r plutôt que la composante a.

Cela fonctionne sur certains périphériques, mais sur l'iPhone 3GS, j'obtiens toujours l'erreur GL_INVALID_OPERATION dans l'appel glTexSubImage2D. Pourquoi? Et comment puis-je résoudre ce problème? Est-il possible, par exemple, de changer le format de texture interne? Ou puis-je créer un autre framebuffer qui possède un composant alpha que je peux utiliser comme source pour glCopyTexImage2D?

Répondre

1

data peut être NULL dans votre glTexImage2D() appel si vous voulez juste d'affecter une texture vide:

data peut être un pointeur NULL. Dans ce cas, la mémoire de texture est allouée pour accueillir une texture de width et height. Vous pouvez ensuite télécharger des sous-textures pour initialiser cette mémoire de texture. L'image n'est pas définie si l'utilisateur tente d'appliquer une partie non initialisée de l'image de texture à une primitive.

+0

Wow! Comment ai-je manqué celui-là ??? IMPRESSIONNANT! Cela rend la vie tellement plus facile, bien sûr! Je vous remercie! –

+0

Avez-vous une idée de l'origine de cette erreur sur l'iPhone 3GS? Est-ce un bug? Ou un cas particulier que je ne vois pas? Si j'initialise la texture avec glTexImage2D et GL_LUMINANCE tout fonctionne, clCopyTexImage2D ne semble pas s'entendre avec GL_LUMINANCE ... –