2

cocos2dを使用して iPhone ゲームを作成中です。いくつかのスプライトを重ね合わせて、それらに影を落とさせようとしています。

現在、シャドウはスプライトとしてレンダリングされており、ほとんどの部分で問題なく動作しています。ただし、シャドウが最も近いレイヤーに当たるようにするだけです。

私たちが達成しようとしていることをうまく説明できる画像を作成しました。

そして、これが現時点で私たちが持っているものです:

基本的に、スプライトは、Z バッファと同じ深度にあるシャドウの部分のみをレンダリングする必要があります。

glDepthFuncandをいじってみましたGL_DEPTH_TESTが、何もうまくいかないようです。

シャドウ スプライト (サブクラス化された CCSprite) をレンダリングする方法は次のとおりです。

- (void)draw {

    glDisable( GL_BLEND );

    glEnable( GL_DEPTH_TEST );
    glDepthFunc( GL_LESS );

    glDepthMask( GL_FALSE );
    [super draw];
    glDepthMask( GL_TRUE );

    glDisable( GL_DEPTH_TEST );

    glEnable( GL_BLEND );
}

呼び出しはそこにあるだけなので、GL_BLEND常にスプライトを見ることができます。

影ではないすべてのスプライトが使用glDepthMask( GL_TRUE )し、各フレームの深度バッファーをクリアしています。

どんな助けでも大歓迎です!

4

1 に答える 1

1
glDepthFunc(GL_LESS)

実際にはデフォルト値です。これは、「現在深度バッファーにあるものがさらに離れている場合にのみ、ピクセルを描画する」ことを意味します。正確に等しくしたい場合は、glDepthFunc(GL_EQUAL) を使用しますが、実際には、それを行うと、あらゆる種類の丸めが奇妙になります。

この目的で深度値を使用できると仮定すると、10 個のオブジェクトがある場合は、次のことをお勧めします。

  1. glClear する前に glClearDepth を 0 に設定します。これにより、保存可能な最も近い値で深度バッファが満たされるため、通常の深度バッファリングでは他に何も描画されません。
  2. 深度を無効にして、バックプレーンに落ちるはずの影を描きます。この時点で、深度バッファーは可能な限り近い値でいっぱいになります。
  3. 深度テストを有効にしますが、glDepthFunc を GL_ALWAYS に設定します。次に、深さの値を適切に設定して、すべての実線の長方形を後ろから前の順序で描画します。
  4. glDepthFunc を GL_LESS に設定し、他のスプライトに落ちるように意図された影を描画します。各スプライトは、関連付けられているスプライトよりも後ろに配置されますが、後ろのスプライトの前に配置されます。

手順 4 に到達するまでに、スプライトが描画されたすべての場所で正確な深度情報が得られ、背景平面があった場所で最も近い値が設定されます。したがって、通常の深度テストは中間の影で機能します — ステップ 3 で描画されたものの上には描画されますが、ステップ 2 で描画されたものの上には描画されません。

古い iPhone ではサポートされていない、代理ステンシルとして深度バッファーを使用しているようなものです。

このタスクに深度バッファーを使用する余裕がない場合は、最初のテクスチャ ユニットをマスク テクスチャとして使用して、影を 2 番目のテクスチャ ユニットにテクスチャとして投影することしか考えられません (または、実際に長方形を描画している場合はそうではありません)。しかし、おそらくそうではないと思います)、スプライトに当たる影ごとに、スプライトごとに 1 つのレンダリング パスを実行します。それはまずまずの解決策ですか?

于 2010-10-17T23:58:52.940 に答える