0

ボックスを作成し、底に「磁石」を配置しています。側面はわずかに透けており (アルファは 0.2 から 0.5 の間)、底面はしっかりしています。gluUnProject() を使用して「磁石」を配置する場所を選択しようとしていますが、ボックスの側面がレンダリングされると、磁石をボックスに入れることができません。

とにかく、壁の側面をレンダリングする必要がありますが、マウスのクリックのためにそれらを無視しますか?

GL_CULL_FACE を試してみましたが、一見したところ、探しているものではないようです。

4

1 に答える 1

4

私の理解が正しければ、半透明の箱があり、磁石が箱の中にある場合、箱の半透明度に応じて磁石が見えるようにします。

私の推測では、ボックスを描画しているときに深度書き込みがオンになっていると思います。このようにして、ボックスが磁石の前に描画された場合、磁石を描画すると深度テストに失敗し、内側の部分が失敗します。結果として描かれます。

これを行う最も簡単な方法は次のとおりです。

  1. 最初にすべてのソリッド オブジェクトを描画します

  2. 深度書き込みを無効にします。

    glDepthMask(GL_FALSE);
    
  3. 半透明のオブジェクトを描画するときは、順序に依存しないブレンド関数を使用します。次に例を示します。

    glBlendFunc(GL_ONE, GL_ONE)
    
  4. すべての透明なオブジェクトを描画します

  5. 深度書き込みを再度有効にする

    glDepthMask(GL_TRUE);
    

この単純な方法は、可換ブレンディング方程式を使用して回避できる場合にのみ機能することに注意してください。そうでない場合は、順序に依存しない透明度の使用を検討してください。良い記事は、Pyarelal Knowles、Geoff Leach、および著の「Efficient Layered Fragment Buffer Techniques」です。ファビオ・ザンベッタ

于 2013-05-08T17:18:27.820 に答える