3

重なり合うクワッドを画面に大量に描画する2Dゲームを作成しています。何が本当に重要ではないものの前に行くのか。

0以上のz値で各クワッドを描画し、glDepthFunc(GL_LESS)を設定すると、期待どおりに非常に優れた速度ブーストが得られます。これは、他のクワッドの背後に完全に隠されているか、部分的に隠されているクワッドを描画する必要がないようにするためです。したがって、次のようなものを使用して四角形を描画します。

float small = (float(1)/1000000);
for (int iii = 0; iii < 100000; iii++) {
    freeSpace = bullets[iii]->draw(opengl, freeSpace, iii*small);
}

ただし、実際の深さにはz値を使用しないので、次のように実行できるはずです。

for (int iii = 0; iii < 100000; iii++) {
    freeSpace = bullets[iii]->draw(opengl, freeSpace, 0.0f);
}

または、0.0fのz値をシェーダーにコーディングするだけです。(3番目の引数はz値であり、シェーダーのgl_positionに変更されずに設定されます。)

奇妙なことに、2番目の方法(毎回z値を0.0fに設定する)では、前者のフレームレートのほぼ半分未満になってしまいます。

どうしてこれなの?どちらもglDepthFunc(GL_LESS)と

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 100000*(2*3));

全く同じで。毎回zを0.0fに設定するともっと速くなると思います。なぜそうではないのですか?

4

1 に答える 1

3

私は前向きではありませんが、プリミティブ間のz値の小さなデルタにより、zcullハードウェアが機能するようになると推測しています。これにより、フラグメントシェーダーに到達する前にフラグメントが選別されます。フラグメントシェーダーの動作を回避することに加えて、このカリングは、フラグメントがデプスバッファーテストに到達したときに、通常のzテストよりも速い速度で発生する可能性があります。

于 2013-02-19T04:18:04.513 に答える