当我尝试旋转图像时,我看到了伪像 [英] I'm seeing artifacts when I attempt to rotate an image

查看:245
本文介绍了当我尝试旋转图像时,我看到了伪像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是之前的:

znd之后:

This is the before: znd after:

:现在我看看imageshack的上传,工件减少了很多..但相信我,他们比这更明显。

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

我不明白为什么会发生这种情况。 Imageshack将它们上传到jpg,但在我的程序中,他们在图像文件夹中为.tif(.tif的原因是因为我不能得到任何其他图像来保持其透明部分)。

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.

这是我的代码的一部分,加载image

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


推荐答案

GL_WRAP 。尝试 GL_CLAMP_TO_EDGE

这篇关于当我尝试旋转图像时,我看到了伪像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆