tags:

views:

136

answers:

2

This is the before: znd after:

EDIT:: Now that I look at imageshack's upload, the artifacts are diminished a great deal.. but trust me, they are more pronounced than that.

I don't understand why this is happening. Imageshack uploads them to jpg, but in my program they are in the image folder as .tif (The reason for .tif is because I couldn't get ANY other image to maintain their transparent parts).

But anyways, these artifacts follow the original top of the image as it rotates anywhere except the original.

Here's part of my code that loads the image

GLuint texture;
GLenum texture_format;
GLint  nofcolors;
GLfloat spin;

bool Game::loadImage()
{
    SDL_Surface * surface; // this surface will tell us the details of the image

    if ( surface = SM.load_image("Images/tri2.tif") )
    {
     //get number of channels in the SDL surface
     nofcolors = surface->format->BytesPerPixel;

     //contains an alpha channel
     if ( nofcolors == 4 )
     {
      if ( surface->format->Rmask == 0x000000ff )
       texture_format =  GL_RGBA;
      else texture_format = GL_BGRA;
     }
     else if ( nofcolors == 3 ) //no alpha channel
     {
      if ( surface->format->Rmask == 0x000000ff )
       texture_format =  GL_RGB;
      else texture_format = GL_BGR;
     }

     // Have OpenGL generate a texture object handle for us
     glGenTextures( 1, &texture );

     // Bind the texture object
     glBindTexture( GL_TEXTURE_2D, texture );

     // Set the texture’s stretching properties
     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

     glTexImage2D( GL_TEXTURE_2D, 0, nofcolors, surface->w, surface->h, 0, texture_format, GL_UNSIGNED_BYTE, surface->pixels );

     glEnable(GL_TEXTURE_2D);
     glEnable(GL_BLEND);
     glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
    }
    else 
    {
     SDL_Quit();
     return false;
    }

    // Free the SDL_Surface only if it was successfully created
    if ( surface )
    {
     SDL_FreeSurface( surface );
     return true;
    }
    else return false;
}

void Game::drawImage()
{
    // Clear the screen before drawing
    glClear( GL_COLOR_BUFFER_BIT );

    glTranslatef( float(S_WIDTH/2), float(S_HEIGHT/2), 0.0f );
    glRotatef( spin, 0.0, 0.0, 1.0 );

    // Bind the texture to which subsequent calls refer to
    glBindTexture( GL_TEXTURE_2D, texture );

    glBegin( GL_QUADS );
    {
     // Top-left vertex (corner)
     glTexCoord2i( 0, 0 );
     glVertex3f( -64, 0, 0 );

     // Top-right vertex (corner)
     glTexCoord2i( 1, 0 );
     glVertex3f( 64, 0, 0 );

     // Bottom-right vertex (corner)
     glTexCoord2i( 1, 1 );
     glVertex3f( 64, 128, 0 );

     // Bottom-left vertex (corner)
     glTexCoord2i( 0, 1 );
     glVertex3f( -64, 128, 0 );
    }
    glEnd();

    glLoadIdentity();
    SDL_GL_SwapBuffers();
}
+3  A: 

Looks like the texture is set to GL_WRAP. Try GL_CLAMP_TO_EDGE instead.

Malte Clasen
Yep, it's definitely wrapping.
Jim Buck
I just started OpenGL like a day or two ago, I don't see any place where I typed GL_WRAP... so where do I put the clamp to edge part?
Justen
Insert the following right after you set the min/mag filters:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Malte Clasen
Ah that worked thanks a lot. Now I gotta figure out this annoying (lack of) transparency in images.
Justen
+2  A: 

In Game::loadImage, after your glBindTexture call:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);     
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Your current setting is GL_REPEAT, which is the OpenGL default.

Jim Buck