2010-07-06 27 views
1

Je ne suis pas sûr d'utiliser glDrawTex_OES correctement. En fait, je suis sûr que je ne suis pas parce que je reçois un rectangle noir sur l'écran plutôt que la texture voulue.Problèmes avec glDrawTex_OES

Pour supprimer les points stupides: Oui, la chaîne GL Extension contient le jeton OES_draw_texture. Oui, la texture est chargée dans la mémoire/etc. correctement: il s'affiche très bien si je le mappe à un polygone. A la lecture des différents bits de documentation I can find, il semble que je doive "configurer [e] le rectangle de recadrage de texture ... via TexParameteriv() avec pname égal à TEXTURE_CROP_RECT_OES". Selon this post dans les forums khronos (meilleure documentation google peut trouver pour moi), les valeurs pour cela sont "Ucr, Vcr, Wcr, Hcr. C'est, gauche/bas/largeur/hauteur"

Voici le code de rendu :

void SetUpCamera(int windowWidth, int windowHeight, bool ortho) // only called once 
{ 
    glViewport(0, 0, windowWidth, windowHeight); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    if(ortho) 
    { 
    float aspect = (float)windowWidth/(float)windowHeight; 
    float halfHeight = 32; 
    glOrthof(-halfHeight*aspect, halfHeight*aspect, -halfHeight, halfHeight, 1.0f, 100.0f); 
    } 
    else 
    { 
    mygluPerspective(45.0f, (float)windowWidth/(float)windowHeight, 1.0f, 100.0f); // I don't _actually_ have glu, but that's irrelevant--this does what you'd expect. 
    } 
} 

void DrawTexture(int windowWidth, int windowHeight, int texID) 
{ 
    // Clear back/depth buffer 
    glClearColor(1, 1, 1, 1); 
    glClearDepth(1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // Next 2 lines probably not necessary, but, you know, sanity check: 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    // set up texture 
    glBindTexture(GL_TEXTURE_2D, texID); // texID is the glGenTexture result for a 64x64 2D RGB_8 texture - nothing crazy. 
    GLint coords [] = {0, 0, 64, 64}; 
    glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, coords); 

    // blit? =(
    glDrawTexiOES(windowWidth/2 - 32, windowHeight - 70, 10, 64, 64); 
} 

Suis-je manque quelque chose évidente? Faire quelque chose de tout simplement stupide?

Répondre

2

Apparemment, le problème est que vous êtes (ou que je suis, selon le cas) n'appelant pas glColor() avec tous les canaux en couleur en premier. Cela semble être un bug dans l'implémentation avec laquelle je travaille (Android, NDK), par défaut Couleur should be (1, 1, 1, 1). Pourtant, appeler glColor4f (1, 1, 1, 1) suffit pour réparer les choses.

(Je n'ai pas d'autres appels à glColor dans mon programme.) Je ne sais pas s'il existe une autre façon de mettre à jour la couleur actuelle, mais les textures utilisent la couleur par défaut et les dessinent avec glEnableClientState (GL_TEXTURE_COORD_ARRAY)/glDrawArrays()

+0

Si quelqu'un peut expliquer pourquoi cela devrait être le cas et n'est pas un bug, je serais heureux de les récompenser pour avoir répondu à la question. –

+0

+1 monsieur. J'aurais aimé lire cette réponse il y a quelques jours au lieu de maintenant, après avoir atteint indépendamment la même conclusion. – richq