OpenGL: Textur Background Problem



  • Hi zusammen,
    ich beschäftige mich gerade mit einem kleinen OpenGl Programm, welches momentan eigtl. nur eine Textur als Hintergrund hat. Das ganze funktioniert eigtl. auch, hier mal ein kleiner Codeausschnitt:

    Texturerstellung (das BMP ist schon geladen)

    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &_textureId);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);
    glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    
    glBindTexture(GL_TEXTURE_2D, _textureId);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, nWidth, nHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pBitmapData);
    

    Und jetzt noch wie das Ganze gezeichnet wird:

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION );
    glLoadIdentity();
    glOrtho(0,1,0,1,-1,1);
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_LIGHTING);
    glDepthMask(GL_FALSE);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    
    glColor3f(1.0,1.0,1.0);
    glNormal3d(0.0, 0.0, -1.0);
    glBegin(GL_QUADS);
    	glTexCoord2f(0.0f, 0.0f);
    	glVertex2f(-1.0, -1.0);
    	glTexCoord2f(2.0f, 0.0f);
    	glVertex2f(1.0,-1.0);
    	glTexCoord2f(2.0f, 4.0f);
    	glVertex2f(1.0,1.0);
    	glTexCoord2f(0.0f, 4.0f);
    	glVertex2f(-1.0, 1.0);
    glEnd();
    

    Wie gesagt, die Textur kommt auch, aber eben zentriert, quasi also GL_CLAMP und nicht GL_REPEAT, ich hätte die Textur eben gern z.B. 10*hintereinander. Hab schon gefühlte Ewigkeiten nichts mehr mit OpenGl gemacht und so komm ich mir leider gerade auch vor 😞

    Danke im voraus
    MfG CatDog



  • Also die Texturkoordinaten sind schonmal falsch, die müssen immer zwischen 0 und 1 liegen (und es sollten float sein, keine double):

    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(-1.0f, -1.0f);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(1.0f,-1.0f);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2f(1.0f,1.0f);
        glTexCoord2f(0.0f, 1.0f);
        glVertex2f(-1.0f, 1.0f);
    glEnd();
    

    Der Rest sollte eigentlich so passen, aber ich mach grad auch nicht viel mit OpenGL.



  • glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);
    glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    

    Hiermit überschreibst Du wie Texturkoordinaten erstellt werden, und dann haben glTexCoord keine Wirkung mehr auf diese Textur.

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    

    Brauchst du nicht setzen, da es ein Standardwert neuer Texturen ist.

    Die glVertex Werte schauen über den Rand heraus. Habe ich mal korrigiert.

    Die Texture Koordinaten sind so richtig wenn Du die Textur 2x4 gekachelt haben möchtest.

    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &_textureId);
    //glEnable(GL_TEXTURE_GEN_S);
    //glEnable(GL_TEXTURE_GEN_T);
    //glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    //glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    
    glBindTexture(GL_TEXTURE_2D, _textureId);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, nWidth, nHeight, 0, GL_BGR, GL_UNSIGNED_BYTE, theImage);
    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION );
    glLoadIdentity();
    glOrtho(0,1,0,1,-1,1);
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_LIGHTING);
    glDepthMask(GL_FALSE);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    
    glColor3f(1.0,1.0,1.0);
    //glNormal3d(0.0, 0.0, -1.0);
    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(0.0f, 0.0f);
        glTexCoord2f(2.0f, 0.0f);
        glVertex2f(1.0f, 0.0f);
        glTexCoord2f(2.0f, 4.0f);
        glVertex2f(1.0f, 1.0f);
        glTexCoord2f(0.0f, 4.0f);
        glVertex2f(0.0f, 1.0f);
    glEnd();
    


  • @Osbios,
    vielen Dank, an GL_TEXTURE_GEN_S und GL_TEXTURE_GEN_T hab ich gar nicht mehr gedacht, ansonsten funktionierts jetzt tadellos 👍

    MfG CatDog


Anmelden zum Antworten