各ピクセルで2つの深度テクスチャの平均を計算する必要があります。私はGLSLフラグメントシェーダでそれを行うことができると期待していますが、私は可能な限りハードウェアで動作するソリューションを好むので、ブレンドを試みました。ここでの主なコードがあります:ブレンドによる2つの深度テクスチャの平均を計算するには?
/// Initialize color buffer to black
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Turn off unnecessary operations
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
glDisable(GL_BLEND);
glDisable(GL_STENCIL_TEST);
glDisable(GL_DITHER);
// Set all matrices to identity
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
RenderAQuadTexturedWith(texture1);
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
RenderAQuadTexturedWith(texture2);
問題は、私は取得していた値が、私は2つのテクスチャのピクセルを取得し、CPU上の平均値を計算することによって得られるものと比較して、周りの0.002でオフになっていることです。 OpenGL Profiler(これはMac OS X 10.6.8)にブレークポイントを設定し、カラーバッファに目を通すと、私の予想どおりに見えます。ブレンドモードにはいくつかの固有の不正確さがありますか?
また、現在の色を0.5、0.5、0.5に設定して、glBlendFunc(GL_ONE, GL_ONE)
を使用してみましたが、エラーは反対方向ですがほぼ同じ大きさでした。
私は間違いがあります:色成分ごとに8ビットのレンダリングバッファにレンダリングし、それらのコンポーネントの1つからピクセルを読み込むと、8ビットの精度しか持たないことになります。
ここで、正確さを失うことなく結果を抽出する方法を理解する必要があります。おそらくgl_FragDepth
を設定するフラグメントシェーダーでしょうか?
いいえ、私はダブルスを使用していません。とにかく、それが浮動小数点対二重の問題だったならば、第3位ではなく、小数点第6位または第7位の違いを見ることを期待しないでしょうか? – JWWalker
テクスチャ値の範囲が0〜255の場合、6桁目は0.002になります。 – shoosh
テクスチャの値の範囲が0〜255の理由がわかりません。私がテクスチャオブジェクトを作成するとき、 'format'と' internalFormat'パラメータに 'GL_DEPTH_COMPONENT'を渡し、OpenGLプロファイラは内部フォーマットを' GL_DEPTH_COMPONENT24'と表示します。深みのあるテクスチャが輝度として解釈されると、何か面白いことがありますか? – JWWalker