1

OpenGL での 3D テクスチャとテクスチャ マッピングについて、いくつかの概念的な質問があり、それを理解しようとしています。質問は、特にこのチュートリアルの 3D テクスチャリング用のコードの実装に関するものです。 =False&sort=ポジション&ビュー=ノーマル&spc=リラックス&select=4729498&fr=1#xx4738025xx

チュートリアルで使用されるデータセットの次元は256 x 256 x 109 (109 2D スライス)です。

1.

このコードは、すべての 2D スライスを 1 つのデータ配列にロードすることで、2D 画像を 3D テクスチャにマップする方法を提供します。次に、fIndxから-1.0fまで+1.0fのステップでインクリメントして、データを 3D テクスチャにマッピングします0.003f。増分が のステップであるのはなぜ0.003fですか? ~666.667 の増分があり、これは 2D スライスの総数 (109 スライス) の約 6.11 倍です。

for ( float fIndx = -1.0f; fIndx <= 1.0f; fIndx+=0.003f )
{
    glBegin(GL_QUADS);
        MAP_3DTEXT( fIndx );
    glEnd();
}

2.

3D テクスチャを使用して、レンダリングされたボリュームを移動する方法を見つけようとしています。私がやろうとしているのは、このウェブサイトのビデオに似ています: http://cvlab.epfl.ch/research/medical/em/synapses

その Web サイトのデータは、2D テクスチャにマッピングされた 2D 画像でなければなりません。ですから、ボリューム内の各レイヤーを消滅させるのは明らかに簡単です (しかし、その方法がわかりません!)。私のデータは次のようになります: http://ctrlv.in/292069

編集

私のデータセットには 256 のスライスがあり、各スライスを 1 つずつ確認したいと考えています。ビデオのようにスライスを 1 つずつ移動するにはどうすればよいですか?

4

1 に答える 1

3

1.

なぜ確かに...浮動小数点ループロジックは悪です。0.003fは浮動小数点で表現できません。これを256回繰り返した後、ループカウンターは -0.232 ではなく ~= -0.231997になりました。整数制御式を使用してこのループを実行し、ループの本体内で最終結果を1000.0fで除算することをお勧めします。私は、このチュートリアルの著者が金融ソフトウェアを作成することを信用しません。彼らはこのようなことをすることであなたのお金を失うでしょう ;)

0.003fは、実際には ~ 0.003000000026077032089233398438... (2 のべき乗で除算として表現できないため、浮動小数点数の繰り返しです)。十分な数の丸め誤差が蓄積されると、値の差がループ カウント ロジックを台無しにするのに十分な場合があります。その数が 190 スライスだけをアドレス指定するのに十分な大きさのステップでインクリメントされたとしても、ループの実行時間が 1 少なくなり、スライスが失われることになります。

256のスライスがあり、反復ごとに 1/256 (2 のべき乗の分母を使用して表現される) ずつインクリメントれる場合、浮動小数点ループ制御が機能します。残念ながら、3 / 1000にはそのようなプロパティはありません。これは、ループに使用するには不適切な浮動小数点値です。浮動小数点を使用して一連の数値を正確に表現できるかどうかを調べるのは面倒なので、通常は浮動小数点ループを完全に回避することをお勧めします。

2.

範囲 [ -1.0 , 1.0 ] (NDC 座標空間) で256 個の一意の値が必要な場合は、-1.0から開始し、反復ごとに正確に 1/128 ( 0.0078125 )ずつインクリメントする必要があります。

于 2014-02-07T00:06:59.950 に答える