3

OpenGLでのカラーピッキングとアンチエイリアスに問題があります。AAがアクティブになっている場合、glReadPixelsの結果は、オブジェクトのエッジとオブジェクトの交差で明らかに間違っています。例えば:

ボックス#32(RGBA:32、0、0、0)の近くにボックス#28(RGBA:28、0、0、0)をレンダリングします。AAを使用すると、AAアルゴリズムが原因で、立方体と三角形が重なる場所で間違ったReadPixel値(30など)を取得したり、ボックスの端で14の値を取得したりする可能性があります。

選ぶ必要のあるオブジェクトが約40万個あります(これはジグソーパズルゲームです)。オブジェクトを形状で選択できることが重要です。

glDisable(GL_MULTISAMPLE)でAAを無効にしようとしましたが、特定のAAモードでは機能しません(AAの実装によって異なります-SS、MS、CS ..)

では、基になるオブジェクトを選択するにはどうすればよいですか?

  1. AAを一時的に無効にする方法はありますか?
  2. 別のバッファを使用していますか、それともレンダリングコンテキストを使用していますか?
  3. 他に何か提案はありますか?
4

2 に答える 2

7

ピックバッファとしてFBOを使用してみませんか?

于 2011-05-25T11:30:40.007 に答える
1

私はこのハックを使用します。1つのピクセルだけでなく、ピッキングポイントの周囲のすべての3x3=9ピクセルを選択します。それらがすべて同じであれば、私たちは安全です。それ以外の場合は、エッジ上にある必要があり、それをスキップできます。

int renderer::pick_(int x, int y)
{
    static_assert(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__,
            "only works on little-endian architecture");
    static_assert(sizeof(int) == 4,
            "only works on architecture that has int size of 4");

    // sort of edge detection. selection only happens at non-edge
    // since the edge may cause anti-aliasing glitch
    int ids[3*3];
    glReadPixels(x-1, y-1, 3, 3, GL_RGBA, GL_UNSIGNED_BYTE, ids);
    for (auto& id: ids) id &= 0x00FFFFFF;       // mask out alpha
    if (ids[0] == 0x00FFFFFF) return -1;        // pure white for background

    // prevent anti-aliasing glitch
    bool same = true;
    for (auto id: ids) same = (same && id == ids[0]);
    if (same) return ids[0];

    return -2;                                  // edge
}
于 2015-04-12T09:51:15.980 に答える