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?
Wow! Comment ai-je manqué celui-là ??? IMPRESSIONNANT! Cela rend la vie tellement plus facile, bien sûr! Je vous remercie! –
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 ... –