選択描画の使い方と、ヒットレコードについて

選択描画glRenderMode( GL_SELECT )では、何も常にシーン全体を描画する必要はなくて、選択させたいオブジェクトだけを描画すればいいわけです。そもそも選択描画なんてものは、本来のレンダリングなんかよりもいろんな場所(とくにマウスのコールバック処理の中とか)で、しかもいろんな異なるやり方で行われるはずのものなので、あちこちで何回だって呼び出せばいいんですよ。で、つまりその処理や場合によって、何を選択描画すべきかは異なるだろうし、必要なものだけ描画すればよいし、そのたびに、それ独自のヒットレコードの解析を記述するのですよ。そういう使い方です。
例えばオブジェクトにツマミがついていて、そのツマミを動かすとオブジェクトが動く。そんなときは、選択描画は、ツマミだけでいいでしょう。(まあ、ツマミが何かに隠れて見えなくなる効果が大事な場合は別やけど。)そうすればヒットレコードの解析だって、どうせツマミしか入ってこないんだから、ヒットしたのはツマミかどうか?なんていう判定が不要になって、Nameの解析がその分楽になるでしょうが。
また、セレクションバッファのHitRecordの内容の中にある、minimum_z, maximum_z値についてですが、RedBookにも書いてあるように、「ウィンドウ座標でのZ値を2の32乗-1倍したもの」と書かれています。こうなるとむしろ、この文章の正確な理解が出来ているかどうかということになってくるのですが、この正確な意味するところについてここでは記述しておきたい。
まず、ウィンドウ座標におけるZ値というものは、NearClipの位置を0.0、FarClipの位置を1.0とした、[0.0, 1.0]の範囲の中にある値なわけである。そして、2の32乗-1とは、そのまま書くと、とりもなおさず、0xffffffff なのだが、これは、int 的には、-1 なので注意。
0xffffffffは、unsigned int 的に考えて、初めて、2の32乗-1 という値を意味するのである。0xffffffffは、明示的にunsigned int でキャストしたものをfloat値にするのが安全と言えよう。
ところで、ヒットレコードの結果から、ヒットを起こした点の座標を求めることができるが、それには、gluUnProject()関数を使う。gluUnProjectは、ウィンドウ座標そのものを入力としているので、ヒットレコードの中のminimum_z, maximum_z の値を使いたい場合は、要するにこれを、(float)(unsigned int)0xffffffff で、割り算した値を、gluUnprojectのZ値として渡してやればよいのである。
(ヒットレコードの中身のフォーマットくらいは、GL使いとしては覚えておきたいところ)