Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 4 of 4

Thread: Blending for textures

  1. #1
    Junior Member Newbie
    Join Date
    Apr 2003
    Location
    Pakistan
    Posts
    23

    Blending for textures

    hello guys

    i am loading two bitmaps . one is for the background whcih covers whole screen with a texture and other is small texture on it. both are loaded ok . but i want the second texture to be blend on other so that the base color of second bitmap is not visible on the background texture. i ahve tried it with glblend but doesn't work. i have gone through NeHe game lesson 33 which does the same thing but failed
    please help me out .
    the code


    {
    int Status=FALSE; // Status Indicator

    AUX_RGBImageRec *TextureImage[2]; // Create Storage Space For The Texture

    memset(TextureImage,0,sizeof(void *)*2); // Set The Pointer To NULL

    // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
    if ((TextureImage[0]=LoadBMP("Data/Heart.bmp")) && (TextureImage[1]=LoadBMP("Data/Sky.bmp")))
    {
    Status=TRUE;
    // Set The Status To TRUE
    glGenTextures(2, &texture[0]); // Create The Texture
    // Typical Texture Generation Using Data From The Bitmap
    for (loop=0; loop<2; loop++) // Loop Through All 5 Textures
    {
    glBindTexture(GL_TEXTURE_2D, texture[loop]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE R,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE R,GL_LINEAR_MIPMAP_NEAREST);// ( NEW )
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[loop]->sizeX, TextureImage[loop]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data); //( NEW )
    }
    }
    for (loop=0; loop<2; loop++) // Loop Through All 5 Textures
    {
    if (TextureImage[loop]) // If Texture Exists
    {
    if (TextureImage[loop]->data) // If Texture Image Exists
    {
    free(TextureImage[loop]->data); // Free The Texture Image Memory
    }
    free(TextureImage[loop]); // Free The Image Structure
    }
    }
    return Status; // Return The Status

    }

    int InitGL(GLvoid)
    {
    if (!LoadGLTextures())
    {
    return FALSE;
    }

    ShadeModel(GL_SMOOTH); // Enable Smooth Shading
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
    glClearDepth(1.0f); // Depth Buffer Setup
    glEnable(GL_DEPTH_TEST);// Enables Depth Testing
    glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
    //glColor4f(1.0f, 1.0f, 1.0f, 0.5); // Full Brightness. 50% Alpha

    glBlendFunc(GL_SRC_ALPHA, GL_ZERO);// Enable Alpha Blending (disable alpha testing)
    glEnable(GL_BLEND);// Enable Blending (disable alpha testing)

    // glAlphaFunc(GL_GREATER ,0.1f); // Set Alpha Testing (disable blending)
    // glEnable(GL_ALPHA_TEST);// Enable Alpha Testing (disable blending)

    glCullFace(GL_BACK);
    glEnable(GL_CULL_FACE);

    return TRUE;
    }

    int DrawGLScene(GLvoid)
    {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
    glLoadIdentity();// Reset The View
    glTranslatef(xtrans,ytrans,-5.0f);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.05f, -0.05f, 1.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.05f, -0.05f, 1.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.05f, 0.05f, 1.0f);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.05f, 0.05f, 1.0f);
    glEnd();
    glDisable(GL_TEXTURE_2D);

    glLoadIdentity();
    glTranslatef(0.0f,0.0f,-4.0f);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glBegin(GL_QUADS);
    glTexCoord2f(1.0f,1.0f); glVertex3f( 28.0f,+0.0f,0.0f); // Top Right
    glTexCoord2f(0.0f,1.0f); glVertex3f(-28.0f,+28.0f,0.0f); // Top Left
    glTexCoord2f(0.0f,0.0f); glVertex3f(-28.0f,-28.0f,-50.0f); // Bottom Left
    glTexCoord2f(1.0f,0.0f); glVertex3f( 28.0f,-28.0f,-50.0f); // Bottom Right
    glEnd();

    glDisable(GL_TEXTURE_2D);

  2. #2
    Junior Member Regular Contributor
    Join Date
    Sep 2002
    Location
    Nanjing,China
    Posts
    118

    Re: Blending for textures

    Do you want to see throught the second texture,
    why not set the glBlend in you program.
    Well, usually , glBlend will make your stuff transparent .usually first you should set
    glBlendFunc(); then enable glBlend and disable the GL_DEPTH_TEST .
    I thought the Nehe lesson 7 or 8( i can not remember exactly ) has the same stuff.

  3. #3
    Junior Member Newbie
    Join Date
    Apr 2003
    Location
    Pakistan
    Posts
    23

    Re: Blending for textures

    well i am trying to make second texture transparent so that only the picture is visible but not its background which is black
    so i am superimposing 2nd texture on fist which is a sky background . still not resolved

  4. #4
    Senior Member OpenGL Pro
    Join Date
    Feb 2002
    Location
    Bonn, Germany
    Posts
    1,652

    Re: Blending for textures

    You can draw your first texture with blending disabled (glDisable(GL_BLEND); ).

    Before drawing the second texture, try this:
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);

    Note here: if you set the second argument to glBlendFunc to GL_ZERO, the stuff already in the frame buffer will not contribute to the result. That's not what you want to do, according to your description.
    ____________________


    Regarding your comments in your GL_init(), I'd also like to point out that blending and alpha testing are independant. You can enable both and both will work at the same time.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •