OpenGLで透明テクスチャがクワッドアルファに代わるものではありません。

StackOverflow https://stackoverflow.com/questions/4601424

  •  25-09-2019
  •  | 
  •  

質問

私はアウトラインを作り、色が透明部分から輝くように、色付きのクワッド上に部分的に透明テクスチャを描画しようとしています。これは、コードです。

// Setup
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

// (...)
// Get image bits in object 't'
glBindTexture(GL_TEXTURE_2D, textureIDs[idx]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
// (...)

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

// Underlying coloured quad
glColor4d(0.0, 1.0, 0.0, 1.0);    
glBindTexture(GL_TEXTURE_2D, 0); 
glBegin(GL_QUADS);
  glVertex3d(coords11.first, coords11.second, -0.001);
  glVertex3d(coords12.first, coords12.second, -0.001);
  glVertex3d(coords21.first, coords21.second, -0.001);
  glVertex3d(coords22.first, coords22.second, -0.001);
glEnd();

// Textured quad    
glColor4d(1.0, 1.0, 1.0, 0.5);
glBindTexture(GL_TEXTURE_2D, textureIDs[castleTextureIndices[0]]); 
glBegin(GL_QUADS);
  glTexCoord2d(0.0, 0.0); glVertex3d(coords11.first, coords11.second, 0);
  glTexCoord2d(1.0, 0.0); glVertex3d(coords12.first, coords12.second, 0);
  glTexCoord2d(1.0, 1.0); glVertex3d(coords21.first, coords21.second, 0);
  glTexCoord2d(0.0, 1.0); glVertex3d(coords22.first, coords22.second, 0);
glEnd();
テクスチャが、それは城の輪郭を持っている場合を除いて黒です。その部分は透明(および白)です。予想される動作は、従って、緑色の輪郭と黒色矩形です。私が代わりに取得すると、白い輪郭線と緑がかった長方形である。

スクリーンショット

0.5テクスチャクワッドセットにアルファとの

。それはs330.photobucket.com/albums/l412/TWBWar/?actionでだ、代わりに私は1.0に設定すると、私はまあ、リンクのような第2のスクリーンショットを投稿することができません(のように、無透明性と質感を取り戻します=ビュー&replace10.png電流=)。 0のアルファを持つ、私は緑色の四角形を取得します。したがって、テクスチャクワッドではなく、私はGL_REPLACEから期待したものであるテクスチャから値を、glColor4dによってアルファ値のセットを使用してブレンドされているように私には思えます。 (私もGL_DECALとGL_MODULATEで実験が、私は私が望んでいた動作を取得することができませんでした。)缶誰もがどのようにOpenGLがブレンドのためのテクスチャではなく、クワッド、アルファを使用して行うことを教えて?

役に立ちましたか?

解決

は、メモリ車線ダウン旅行のための準備をしなさいます。

glTexImage2D(GL_TEXTURE_2D, 0, 3, ..., ..., 0, GL_RGBA, GL_UNSIGNED_BYTE, ...);

3あなたの問題があるのそれ。引数(RGBA + UNSIGNED_BYTE)の右部分は、ソース・データ・タイプが何であるかを言及しています。 の先のデータ型の第3引数(GLとして、あなたのテクスチャを格納する、すなわち何)です。

GL 1.0を作成したとき、それは、偶然にも、テクスチャリングはやや単純でした。パラメータがマッピングのみで、あなたの最終テクスチャーのために望んでいたチャンネルの番号を指定する必要がありましたので、

1=GL_LUMINANCE
2=GL_LUMINANCE_ALPHA
3=GL_RGB
4=GL_RGBA

私はこの使用が推奨されますが、あなたが見ることができるように、まだ動作信じています。

だから... ...あなたのテクスチャがアルファなし、GL_RGBとして格納されます。

残りは仕様のシンプルなアプリケーションです。内部形式RGBとテクスチャに置き換えfinal_color=texture_colorfinal_alpha=fragment_alpha(あなたのケースでglColorから別名ソース)を行います。内部フォーマットに基づいて、テクスチャ環境の完全な表については、このmanページを参照してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top