当我试图旋转图像时,我看到了文物

时间:2009-07-27 22:55:12

标签: c++ user-interface opengl

这是之前的: http://img22.imageshack.us/img22/5310/beforedes.jpg 之后: http://img189.imageshack.us/img189/8890/afterr.jpg

编辑::现在我看看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();
}

2 个答案:

答案 0 :(得分:3)

看起来纹理设置为GL_WRAP。请改为GL_CLAMP_TO_EDGE

答案 1 :(得分:2)

在你的glBindTexture调用之后的Game :: loadImage中:

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的默认设置。