0

2Dビデオゲームを作っています。現在、スプライトはそれほど多くなく、深度バッファのない 1 つのテクスチャで問題なく動作します。しかし、複数のテクスチャに拡張するときは、深度バッファを使用して、同じテクスチャに対して複数のパスを作成する必要がないようにし、深度の制約に関してテクスチャを整理する必要がないようにします。

深度バッファを機能させようとすると、正しいクリアカラーの空白の画面しか表示されません。深度バッファを使用しない作業セットアップについて説明し、深度バッファへのアップグレードに関する質問をリストします。

  • 現在、私の頂点には位置(x,y)とテクスチャ(x,y)の座標しかありません。他に何もありません。照明なし、法線なし、色なしなど。ここで行う必要がある唯一のアップグレードは、自分の位置に az coord を追加することだけでよいでしょうか?

  • 現在、私は使用しています:

glOrthof(-2, 2, -3, 3, -1, 1);

これは深度バッファなしで機能します。しかし、深度バッファーを追加するときは、near 値と far 値を変更する必要があると思います。それらを何に変更すればよいですか?

  • 今私の glTexImage2D() のために私は使用しています:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, ピクセル);

深度バッファを追加するとき、これらの引数のいずれかを変更する必要がありますか?

  • への呼び出しglClearDepthf();では、glOrthof() への呼び出しで使用する Near または Far 値のいずれかを使用する必要がありますか? どれ?
4

2 に答える 2

1

2D とオルソで作業しているので、解像度に一致する座標を持つビューポートを使用すると役立つことがわかりました。これにより、物事が読みやすくなります。

CGRect rect = self.view.bounds;
if (ORTHO) {
    if (highRes && (retina == 1)) {
        glOrthof(0.0, rect.size.width/2, 0.0 ,  rect.size.height/2, -1, 1000.0);
    } else {
        glOrthof(0.0, rect.size.width, 0.0 ,  rect.size.height, -1, 1000.0);    
    }
    glViewport(0, 0, rect.size.width*retina, rect.size.height*retina);
} 

私は網膜上でも常に 320x480 座標を使用していることに注意してください。この方法では、両方の解像度に同じ座標を使用できます。.5 を指定すると、網膜上でピクセル パーフェクトが得られますが、別の方法を使用することもできます。

深さについては、-1~1000の深さを使っているので、-1000Zまで描けます。

次のように、深度バッファを正しくバインドしていることを確認してください。

    // Need a depth buffer
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES,  framebufferWidth, framebufferHeight);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

または、問題は、カメラとライトの背後にある深さ、またはバッファーよりも大きい深さを使用するのと同じくらい単純な場合があります。0 から -1 (例では -0.5) の間の深さを使用してみてください。 1000;

編集

近距離と遠距離の glOrthof の値は、座標ではなく量 (距離) を指定するため、深さの値を指定するときに混乱する可能性があります。far パラメーターに 1000 を指定すると、実際にはファー クリッピング プレーンはビューアーから 1000 ユニット離れているということです。これはニア フィールドと同じですが、残念ながらビューアーの後ろにクリッピング プレーンを指定すると負の値が取られます。混乱に。

したがって、描画時には、視聴者から 1000 ユニット前方 (画面の奥) にクリッピング プレーンがあり、座標に関しては、Z はビュー プレーンの下 (画面の奥) の場合は負であり、実際に描画する世界は次のようになります。 Z = 1 と Z = -1000 の間で、-1000 がこれらのパラメーターで可能な最大距離です。

于 2011-11-22T11:05:18.510 に答える
0

たとえばCocos2Dなどの既存のライブラリを使用しない場合は、いずれかに基づいて自分で深度バッファを管理するマネージャを作成する必要があります。

  • 画面に追加された順序
  • ユーザーがカスタマイズした Z 値なので、必要に応じて交換できます
于 2011-11-22T04:22:53.667 に答える