webgl ピッキングを最初から実装しており、レイ交差テストとは対照的に、GLSL ルートをたどることにしました。
そのため、シーン全体を個別のフレーム バッファーにレンダリングし、各オブジェクトに一意の色を割り当てて、フラグメント シェーダーに均一変数として渡します。シーンがレンダリングされると、バッファーを gl.readPixels() し、クリック座標で色の値を取得します (ブラウザーの座標系とは異なる GL を考慮して座標系を反転させます)。
私が抱えている問題は、シェーダーが gl_FragColor シェーダー出力に渡される色を、カラー チャンネルごとに 0.0-1.0 の範囲で vec4 浮動小数点数として表すのに対し、gl.readPixels() はカラー チャンネルを 0-255 の範囲の整数として返すことです...この変換を行う一部の精度が失われ、ピッキング エラーが発生する可能性があります (シーン内に多数のオブジェクトがある場合 (255 を超える場合)、または整数から浮動小数点への丸めが、異なるオブジェクト ID を区別するために必要な粒度よりも大きい場合)。
誰かがこれを解決する方法を知っていますか、または私を正しい方向に向けますか? readPixels() は 0.0 ~ 1.0 の範囲のカラー チャネルの float 値を返すことができますか? 複数のチャネルにまたがる単一のオブジェクト ID をパックできますか (単一のチャネルに限定されず、255 個のオブジェクトしか選択できないようにするには?)
ご協力ありがとうございました