multitexturing + vertex arrays



  • Hi!
    Ich wollt meine Sprite-REnderfunktion Multitexturing fähig machen, zuerst ohne Vertex Arrays was mit glActiveTextureARB(...) gut klappte. Und jetzt will ich Vertex Arrays auch noch verwenden, dazu muss man ja glClientActiveTextureARB(...) verwenden, aber irgendwie funzt das nicht, hier mal der Code:

    void CSprite::OnRender()
    {
        if(m_Show)
        {
            int TextureStage=0;
            glLoadIdentity();
            glPopMatrix();
            glPushMatrix(); 
            glTranslatef(vCenter.v[0], vCenter.v[1],vCenter.v[2]);
            glScalef(vScale.v[0], vScale.v[1], vScale.v[2]);
    
            glVertexPointer(3, GL_FLOAT, sizeof(CVector3D), &vertices[0].v[0]); 
            glEnableClientState(GL_VERTEX_ARRAY);   
    
            //Iterator auf Begin der Liste setzten
            pShader->Textures = pShader->Texturelist.begin();
    
            while(pShader->Textures!=pShader->Texturelist.end())
            {
                for (TextureStage=0; TextureStage < maxTextureUnits; ++TextureStage)
                {
                    //Kein neues Unit muss aktiviert werden, weil maximale Anzahl der
                    //Texturen schon erreicht ist
                    if(pShader->Textures==pShader->Texturelist.end())
                        break;
    
                    //Neues Unit aktivieren, TexCoords setzten etc.
                    glClientActiveTextureARB(GL_TEXTURE0_ARB+TextureStage);
                    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
                    glTexCoordPointer(2, GL_FLOAT, sizeof(CTexcoord), &texcoords[0].t[0]);
                    glEnable(GL_TEXTURE_2D);
                    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    
                    //Aktuelle Texture auswählen
                    (*pShader->Textures)->Texture.Bind();
                    //Texture um eins erhöhen
                    ++pShader->Textures;             
                }
                //Objekt zeichnen
                glDrawElements(TypeOfMesh, Size, GL_UNSIGNED_INT, &indices[0]);
                //Neuen Pass mit altem überblenden
                glEnable(GL_BLEND);
            }
    
            glClientActiveTextureARB(GL_TEXTURE1_ARB);
            glClientActiveTextureARB(GL_TEXTURE0_ARB);
    
            glDisable(GL_BLEND);
           }    
    }
    

    Mein Problem ist, dass trotzdem nur die letzt Textur verwendet wird...

    thx im vorraus
    cu



  • okay, ich habs: glClientActiveTextureARB(...) ist nur um die Texturkoordinaten zu verwenden, danach muss noch glActiveTextureARB(..) aufgerufen werden...


Anmelden zum Antworten