3

フォーマットを設定します:

QGLFormat format = QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer);
setFormat(format);

コンストラクター内。

次に、initializeGLでdepthTestingをオンに設定します。

void VoxelEditor::initializeGL()
{
    glClearDepth(2000.0);                                   // Enables Clearing Of The Depth Buffer
    glEnable(GL_DEPTH_TEST);                            // Enables Depth Testing
    glDepthFunc(GL_LESS);                               // The Type Of Depth Test To Do
    glShadeModel(GL_SMOOTH);                            // Enables Smooth Color Shading
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations
}

paintGLで、デプスバッファをクリアします。

void VoxelEditor::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    draw();
}

以前はより少ない頂点で動作していたことを覚えているので、depthbufferが処理するには多すぎる頂点を使用している可能性があります(?)。私は32*32 * 32のボクセルを持っており、ほとんどの場合半分の時間で描画されるため、98304クワッドです。

ただし、深度テストはまだ機能せず、実行順にクワッドが表示されます。

4

2 に答える 2

1

そのため、depthbufferが処理するには多すぎるために使用している可能性があります(?)。

デプスバッファは頂点を認識しません。表示されるのは着信フラグメントだけであり、いくつでもかまいません。

void VoxelEditor::initializeGL()
{
    glClearDepth(2000.0);   // Enables Clearing Of The Depth Buffer

この行はクリアを有効にしません。これは、デプスバッファがクリアされる値を設定します。値は0〜1の範囲である必要があります。クリアの深さは、正規化されたデバイス座標で表されます。つまり、モデルビュー、投影、および均一分割が適用された後です。デフォルト値は1です。

    glEnable(GL_DEPTH_TEST);  // Enables Depth Testing
    glDepthFunc(GL_LESS);     // The Type Of Depth Test To Do
    glShadeModel(GL_SMOOTH)  // Enables Smooth Color Shading
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations

いいえ、そうではありません。パースペクティブは単なる線形変換であり、常に同じように機能します。つまり、テクスチャ座標は、品質を向上させるために別の方法で補間される可能性があります。

}

これらの呼び出しは何も初期化されないため、描画関数に入れることを常にお勧めします。描画状態を設定します。OpenGLはステートマシンであり、ステートマシンの重要なルールは、ステートマシンを追跡するか、使用するたびに既知の状態にする必要があるということです。

于 2012-02-17T21:52:41.140 に答える
0

draw()でsetDepthTestを設定することでこれを修正しました。

glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);
于 2012-02-17T23:14:53.623 に答える