1

これは本当に簡単なはずですが、何時間も費やしていて、何が起こっているのかわかりません。

フラットカラーのフルスクリーンクワッドをテクスチャにレンダリングしてから、glGetTexImageで結果を読み戻しています。これはGPGPUに関連しているので、アルファ値を他の3つと同じように動作させたいと思います。GL_RGBA32F_ARB重要な場合は、10.5のMacBook ProでFBO、テクスチャフォーマット、NVidiaカードを使用しています。

指定したアルファが1の場合にのみ、正しい色が返されます。他の値では、明示的に無効にしたにもかかわらず、フレームバッファにすでにあるものとブレンドしているように見えますGL_BLEND。ブレンドと使用も有効にしてみglBlendFunc(GL_ONE, GL_ZERO)ましたが、最終結果は同じです。レンダリングする前にフレームバッファをゼロにクリアすることで修正できますが、なぜそれが必要なのかを理解したいと思います。2番目のテストとして、元の4チャンネルの色を元に戻したい場合に、2つの重なり合う四角形をレンダリングするとブレンドされた結果が得られます。確かに、単色のクワッドはフレームバッファ内のピクセルを完全に上書きする必要がありますか?根本的なことを誤解していると思います。ありがとう。

 const size_t res = 16;
 GLuint tex;
 glGenTextures(1, &tex);
 glBindTexture(GL_TEXTURE_2D, tex);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F_ARB,
  res, res, 0, GL_RGBA, GL_FLOAT, 0);
 glBindTexture(GL_TEXTURE_2D, 0);

 GLuint fbo;
 glGenFramebuffersEXT(1, &fbo);
 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
  GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0);
 glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);

 glViewport(0, 0, res, res);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glOrtho(0, res, 0, res, -1, 1);

 glClearColor(0,0,0,0);
 glClear(GL_COLOR_BUFFER_BIT);

 //glEnable(GL_BLEND);
 //glBlendFunc(GL_ONE, GL_ZERO);
 glDisable(GL_BLEND);
 glDisable(GL_DEPTH_TEST);

 glColor4f(0.2, 0.3, 0.4, 0.5);

 for (int i=0; i<2; ++i) {
  glBegin(GL_QUADS);
  glVertex2i(0,0);
  glVertex2i(res, 0);
  glVertex2i(res, res);
  glVertex2i(0, res);
  glEnd();
 }

 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

 std::vector<float> tmp(res*res*4);
 glBindTexture(GL_TEXTURE_2D, tex);
 glGetTexImage(GL_TEXTURE_2D, 0,
  GL_RGBA, GL_FLOAT, &tmp.front());
 const float * const x = &tmp.front();
 cerr << x[0] << " " << x[1] << " " << x[2] << " " << x[3] << endl;
 // prints 0.3 0.45 0.6 0.75

 glDeleteTextures(1, &tex);
 glDeleteFramebuffersEXT(1, &fbo);
4

1 に答える 1

1

あまり良い答えではありませんが、注意すべき点がいくつかあります。

  • あなたが観察しているものは、ブレンドのようには見えません。1 つには、バック バッファーは最初は rgba=0 であるため、それに対してアルファ ブレンディングを行うと、0.2 0.3 0.4 0.5 ではなく 0 が得られます。
  • 私の傾向は、テクスチャとフレームバッファのアタッチメントと同じテクスチャバッファを何らかの方法で設定することでした。これは仕様では定義されていません (セクション 4.4.3)。あなたが提供するコードスニペットでは、glBindTexture(GL_TEXTURE_2D, 0)そうではないことを確認する必要があります...見逃した場合に備えて、ここで許可します。
于 2009-10-20T07:56:00.717 に答える