2009-07-28 5 views
0

を動作させることはできません。そこにソースコードでI'm seeing artifacts when I attempt to rotate an imageは私が私の画像の透明性は私のこの質問からステミング

私は私の人生のためにいずれかを取得することはできませんので、私はTIFをロードしています透明部分を正しく読み込むための他のイメージフォーマット。私はPNG、GIF、& TGAを試しました。私はPNGをロードできるようにしたいと思います。私は、上記の質問で与えられたソースコードが十分であることを願っています。そうでなければ、私に知らせてください。

他の形式を読み込もうとすると、何が起こるのかをより詳しく説明しています。試していた画像の1つは、128 * 128オレンジ色の三角です。フォーマットに応じて、128 * 128の正方形をオレンジ色にするか、画像の透明部分を白くします。

答えて

1

OK、私はOpenGL + SDLの新機能ですが、ここには何がありますか?すべて読み込みますか? SDL_imageは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); 

そしてもちろん...リストを呼び出して、私のコードのいずれかのに役立つだろうあまりにも高く評価される! :)

+0

コードからビットとピースを使用して、最終的に機能しました。 (私はIMG_Load()の代わりに自分の関数を使用しました)、BPPを変換していたときにアルファレイヤを破棄していました。 – Justen

1

私はSDLに精通していませんが、画像をロードするのはSDLなので、私は彼らのドキュメントをよく見るでしょう。私はOpenGLと一緒に自分自身の仕事で.pngを使用し、透明性は問題なく動作します。 (私はLightZPngと呼ば.PNGパーサーを使用)

また、私はちょうど気づいたあなたのリンク投稿があります。代わりに

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

をこれは、追加の影響だろうピクセルがの場合はは背景にあるものに透明になります(これらのテクセルではアルファが0であると仮定します)。

+0

これを変更すると、画像がまったく表示されなくなります。今のTIFでも、 – Justen

+0

ええ、あなたのすべてのテクセルでアルファは単純に0になるのでしょうか? glTexImage2Dに渡す前に画像データを見て、いくつかのテクセルのアルファ値を確認します。単純にRGB画像(アルファが全くない)の場合は、レンダリングの前にglColor4ub(255,255,255,255)を実行して、アルファが完全に不透明に設定されていることを確認してください。 –

2

すると、アルファブレンディングは、透明性がなければならない固体の色を描画しますそう

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

プリミティブで有効になっていることを確認します。 異なるblendfuncが必要な場合があります。これは一般的な設定です。

+0

私は以前の質問でそのコードを最初の投稿にリンクしています。 – Justen

+0

実際には、あなたは持っている:glBlendFunc(GL_ONE、GL_ONE_MINUS_SRC_ALPHA); // GL_SRC_ALPHAの代わりにGL_ONEに気付く - これはあなたが見ているものに応じて違いを生むことがある –

+0

申し訳ありませんがコードをすでに持っていればiPhone上でコードブロックをスクロールできませんでした。ジムが言っているように、あなたが持っているblendfuncは正しくないかもしれません。使用しているblendfuncは、テクスチャとあらかじめ乗算されたアルファをブレンドするためのものです。 – M84

関連する問題