2009-07-28 69 views
0

從我的這個問題詞幹:I'm seeing artifacts when I attempt to rotate an image我不能讓我的圖片的透明度工作

在源代碼中有,我加載TIF,因爲我不能爲我的生命得到任何其他圖像格式正確加載透明部分。我試過PNG,GIF,& TGA。我希望能夠加載PNG。我希望在上面的問題中給出的源代碼就足夠了,如果沒有,請告訴我。

對於當我嘗試加載其它格式會發生什麼更好的描述 - 一個我試圖圖像的是128 * 128的橙色三角形。根據格式的不同,它可能會使整個128 * 128的方形橙色,或使圖像的透明部分變爲白色。

回答

1

OK,我在OpenGL的+ SDL新的,但這裏是我..加載所有?格式SDL_image支持,除非我不能讓.xcf工作,並且沒有.lbm來測試。

//called earlier.. 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

//load texture 
SDL_Surface* tex = IMG_Load(file.c_str()); 
if (tex == 0) { 
    std::cout << "Could not load " << file << std::endl; 
    return false; 
} 

glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 

//nearest works but linear is best when scaled? 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

width = tex->w; 
height = tex->h; 

//IMG_is* doesn't seem to work right, esp for TGA, so use extension instead.. 
std::string ext = file.substr(file.length() - 4); 
bool isBMP = (ext.compare(".bmp") == 0) || (ext.compare(".BMP") == 0); 
bool isPNG = (ext.compare(".png") == 0) || (ext.compare(".PNG") == 0); 
bool isTGA = (ext.compare(".tga") == 0) || (ext.compare(".TGA") == 0); 
bool isTIF = ((ext.compare(".tif") == 0) || (ext.compare(".TIF") == 0) || 
       (ext.compare("tiff") == 0) || (ext.compare("TIFF") == 0)); 

//default is RGBA but bmp and tga use BGR/A 
GLenum format = GL_RGBA; 
if(isBMP || isTGA) 
    format = (tex->format->BytesPerPixel == 4 ? GL_BGRA : GL_BGR); 

//every image except png and bmp need to be converted 
if (!(isPNG || isBMP || isTGA || isTIF)) { 
    SDL_Surface* fixedSurface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); 
    SDL_BlitSurface(tex, 0, fixedSurface, 0); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format, GL_UNSIGNED_BYTE, fixedSurface->pixels); 
    SDL_FreeSurface(fixedSurface); 
} else { 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format, GL_UNSIGNED_BYTE, tex->pixels); 
} 

SDL_FreeSurface(tex); 

list = glGenLists(1); 
glNewList(list, GL_COMPILE); 
    GLint vertices[] = { 
      0,0, 0,0, 
      0,1, 0,height, 
      1,1, width,height, 
      1,0, width,0 
     }; 

    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glEnableClientState(GL_VERTEX_ARRAY); 

    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexCoordPointer(2, GL_INT, 4*sizeof(GLint), &vertices[0]); 
    glVertexPointer(2, GL_INT, 4*sizeof(GLint), &vertices[2]); 
    glDrawArrays(GL_POLYGON, 0, 4); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glEndList(); 

然後畫出我設置顏色爲白色不透明的(不影響透明度?),那麼只需要調用列表..

glColor4f(1,1,1,1); 
glCallList(list); 

和當然,我的代碼的任何幫助將也非常感謝! :)

1

我不熟悉SDL,但因爲它是SDL在加載圖像,我想看看他們的文檔更近。我在自己的作品中使用了.png和OpenGL,透明效果沒有問題。 (我用叫LightZPng .png文件分析器)

另外,我只注意到你的鏈接後有:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

代替:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

這將有加入的影響像素應該對背景中的任何物體都是透明的(假設這些紋素中的α爲0)。

+0

改變這種使圖像不會出現在所有。即使是現在的TIF – Justen 2009-07-28 05:05:19

+0

呵呵,是不是所有的紋素都只有0?在將它傳遞給glTexImage2D之前,我會先查看圖像數據,以確認某些紋素的alpha值。如果它們僅僅是RGB圖像(根本沒有alpha),那麼在渲染之前一定要做glColor4ub(255,255,255,255)以確保你的alpha被有效地設置爲完全不透明。 – 2009-07-28 05:47:34

2

請確保您有

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

否則啓用原語alpha混合將利用純色裏應該有透明度。 您可能需要一個不同的blendfunc。這是一個常見的設置。

+0

我在第一篇文章中鏈接了上一個問題中的代碼。 – Justen 2009-07-28 02:26:00