2009-07-27 2 views
1

Это раньше: http://img22.imageshack.us/img22/5310/beforedes.jpg ZND после: http://img189.imageshack.us/img189/8890/afterr.jpgЯ вижу артефакты, когда я пытаюсь повернуть изображение

EDIT :: Теперь, когда я смотрю на загрузку Imageshack, в артефакты уменьшаются много .. но поверьте мне, они более выражены, чем это.

Я не понимаю, почему это происходит. Imageshack загружает их в jpg, но в моей программе они находятся в папке с изображениями как .tif (причина .tif заключается в том, что я не мог получить ЛЮБОГО другого изображения для сохранения своих прозрачных частей).

Но в любом случае эти артефакты следуют оригинальной верхней части изображения, поскольку он вращается в любом месте, кроме оригинала.

Вот часть моего кода, который загружает изображение

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(); 
} 
+0

lol, когда я загрузил эту страницу, я думал, что ваши артефакты были пылью на моем экране, и я попытался стереть ее. – GManNickG

+0

Попробуйте сохранить как PNG? –

+0

Формат PNG не загрузит прозрачность в моей программе. Ничто иное, кроме TIF. Это сводит меня с ума .. – Justen

ответ

3

выглядит как текстура установлен GL_WRAP. Вместо этого попробуйте GL_CLAMP_TO_EDGE.

+0

Да, это определенно обертывание. –

+0

Я только что запустил OpenGL, как день или два назад, я не вижу места, где я набирал GL_WRAP ... поэтому, где я должен поставить зажим к краю? – Justen

+1

Вставьте следующее сразу после установки фильтров min/mag: glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); –

2

В игре :: LoadImage, после glBindTexture вызова:

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

Ваш текущий параметр GL_REPEAT, который является OpenGL по умолчанию.

Смежные вопросы