2

ブロックのペイントと選択のために、レイ ピッキング アルゴリズムを実装しようとしています (したがって、かなりの精度が必要です)。最初はレイ キャスティングの実装を使用しましたが、十分に正確ではないと感じました (交差テストに問題があった可能性はありますが)。とにかく、深度バッファーを使用して選択し、マウス座標をワールド座標に変換してみることにしました。以下の実装:

glm::vec3 Renderer::getMouseLocation(glm::vec2 coordinates) {
    float depth = deferredFBO->getDepth(coordinates);

    // Calculate the width and height of the deferredFBO
    float viewPortWidth = deferredArea.z - deferredArea.x;
    float viewPortHeight = deferredArea.w - deferredArea.y;

    // Calculate homogenous coordinates for mouse x and y
    float windowX = (2.0f * coordinates.x) / viewPortWidth - 1.0f;
    float windowY = 1.0f - (2.0f * coordinates.y) / viewPortHeight;

    // cameraToClip = projection matrix
    glm::vec4 cameraCoordinates = glm::inverse(cameraToClipMatrix) 
                                * glm::vec4(windowX, windowY, depth, 1.0f);

    // Normalize
    cameraCoordinates /= cameraCoordinates.w;

    glm::vec4 worldCoordinates = glm::inverse(worldToCameraMatrix) 
                               * cameraCoordinates;

    return glm::vec3(worldCoordinates);
}

問題は、値が簡単に ±3 単位 (ブロックの幅は 1 単位) になり、ニア クリッピング プレーンに非常に近い場合にのみ十分な精度が得られることです。

不正確さは、単精度浮動小数点数の使用に起因するものですか、それとも私の計算の何らかのステップに起因するのでしょうか? 倍精度値を使用すると役に立ちますか? OpenGL は深度バッファーに対してもそれをサポートしていますか?

最後に、この方法がうまくいかない場合、どのポリゴンが選択されたかを正確に識別するためにカラー ID を使用するのが最善でしょうか?

4

1 に答える 1

1

色は行くべき道です。深度バッファの精度は、平面距離、FBO テクスチャの解像度、およびサーフェスの法線または傾斜に依存します。同じ精度の問題が、標準のシャドウイング中に発生します。(深さ交差テストでは、1 つのオブジェクトがより多くの「色」、深さの値を持つため、色を使用する方が少し簡単です。1 つのオブジェクトに 1 つの色がある場合は、より正確です。)

また、それは私だけかもしれませんが、必要でない場合は、かなり複雑な行列計算を避けたいと思っています。貧弱なCPUが他のことをするだけで十分です。

倍精度値の場合、パフォーマンスが大幅に低下する可能性があります。私はこの種のパフォーマンスの低下に遭遇しました.floatではなくdoubleを使用すると、約3倍遅くなりました

私の投稿: GLSL パフォーマンス - 関数の戻り値/型とこれに関する記事: https://superuser.com/questions/386456/why-does-a-geforce-card-perform-4x-slower-in-double-precision -テスラカードよりも

そうです、64 ビット浮動小数点数 (double) を使用できます: http://www.opengl.org/registry/specs...hader_fp64.txtおよびhttp://www.opengl.org/registry/specs.. .trib_64bit.txtですが、そうすべきではありません。

全体として、色付きのポリゴンを使用しています。私は色が好きです。

編集:倍精度深度の詳細: http://www.opengl.org/discussion_boards/showthread.php/173450-Double-Precision、かなり良い議論

于 2013-12-03T20:32:46.890 に答える