2

ビリヤードシミュレーションを作成しようとしていますが、glReadPixelsとgluUnProjectを使用して、マウスポインターをシーンに投影しています。

これは、マウスがシーン内のオブジェクト(たとえばテーブル)を指している場合は正常に機能しますが、マウスが背景を指している場合、glReadPixels呼び出しが1.0を返すため、gluUnProjectを台無しにします。

テーブルの同じレベルに透明な平面を描画する方法を理解しようとしています。これにより、シーンのどこにマウスを向けても、テーブルと同じ平面を指しているかのように奥行きが得られます。 。

glAlphaFunc(GL_GREATER、0.01f);なしで透明なクワッドを描画した場合。クワッドを白で描画し、深度テストは計画どおりに機能しますが、alphaFuncの呼び出しを追加してクワッドを透明にすると、深度は以前の状態に戻ります。私が見たところ、glReadPixelsはフレームバッファからピクセルを読み取るので、これは理にかなっています。どうすればこれを回避できるのか疑問に思っています。

また、クワッドの巻線を逆にして上から見えないようにしましたが、これには、フレームバッファから測定値を取得するglReadPixelsと同じ問題があります。

つまり、オブジェクトを画面に描画せずに、glReadPixelsを取得してオブジェクトから深度コンポーネントを取得するにはどうすればよいですか?

glReadPixelsとgluUnProjectの呼び出しは次のとおりです。

winX = (float)x;
winY = (float)viewport[3] - (float)y;
glReadPixels(x, (int) winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);    
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
4

2 に答える 2

0

を使用して、カラー バッファへの書き込みを完全に無効にすることができます。

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

この後に何かを描画すると、深度テストが行​​われ (有効になっている場合)、その深度値が深度バッファーに書き込まれます (有効になっている場合) が、そのフラグメントはカラー バッファーに表示されません。

于 2011-05-03T23:17:26.133 に答える
0

これは、アルファ テストがテストに合格しなかったピクセルを完全に破棄するためです。

ただし、gluUnProject は深度バッファ値 1.0 でチョークしないようにする必要があります。深度バッファ値 1.0 の値として取得する必要があるのは、ファー クリッピング プレーンの距離です。

于 2011-05-03T20:38:17.767 に答える