2011-06-28 15 views
2

各ピクセルで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を設定するフラグメントシェーダーでしょうか?

答えて

0

私が質問に追加したように、問題の根本は深度テクスチャやブレンドモードではなく、色成分あたり8ビットのバッファにレンダリングしていただけです。より高精度のカラーバッファを得るために私が邪魔をしてしまうと、おそらくうまくいくでしょう。しかし、私は、出力をgl_FragDepthに入れるフラグメントプログラムを使用する代わりに、すでに24ビットのデプスバッファを持っていたので、それはうまくいくように思えます。

2

GPUはすべてfloatで計算します。ご使用のCPUのリファレンスがfloatで、doubleではないことも確認してください。

+0

いいえ、私はダブルスを使用していません。とにかく、それが浮動小数点対二重の問題だったならば、第3位ではなく、小数点第6位または第7位の違いを見ることを期待しないでしょうか? – JWWalker

+0

テクスチャ値の範囲が0〜255の場合、6桁目は0.002になります。 – shoosh

+0

テクスチャの値の範囲が0〜255の理由がわかりません。私がテクスチャオブジェクトを作成するとき、 'format'と' internalFormat'パラメータに 'GL_DEPTH_COMPONENT'を渡し、OpenGLプロファイラは内部フォーマットを' GL_DEPTH_COMPONENT24'と表示します。深みのあるテクスチャが輝度として解釈されると、何か面白いことがありますか? – JWWalker

関連する問題